• 模板—主席树


    #include<bits/stdc++.h>
    using namespace std;
    const int maxn=2e6+7;
    int n,m,q;
    int a[maxn];
    int b[maxn];
    int root[maxn];
    int lc[maxn<<5];
    int rc[maxn<<5];
    int sum[maxn<<5];
    int l,r,k,p;
    int cnt;
    void build(int &t,int l,int r)
    {
        t=++cnt;
        if(l==r) return;
        int mid=(l+r)>>1;
        build(lc[t],l,mid);
        build(rc[t],mid+1,r);
    }
    int modify(int o,int l,int r)
    {
        int oo=++cnt;
        lc[oo]=lc[o],rc[oo]=rc[o],sum[oo]=sum[o]+1; 
        if(l==r) return oo;
        int mid=(l+r)>>1;
        if(p<=mid) lc[oo]=modify(lc[oo],l,mid);
        else rc[oo]=modify(rc[oo],mid+1,r);
        return oo;
    }
    int query(int u,int v,int l,int r,int k)
    {
        int ans,mid=(l+r)>>1,x=sum[lc[v]]-sum[lc[u]];
        if(l==r) return l;
        if(x>=k) ans=query(lc[u],lc[v],l,mid,k);
        else ans=query(rc[u],rc[v],mid+1,r,k-x);
        return ans;
    }
    int main()
    {
        int ans;
        scanf("%d%d",&n,&m);
        for(int i=1;i<=n;i++)
        {
            scanf("%d",&a[i]);
            b[i]=a[i];
        }
        sort(b+1,b+1+n);
        q=unique(b+1,b+1+n)-b-1;
        build(root[0],1,q);
        for(int i=1;i<=n;i++)
        {
            p=lower_bound(b+1,b+q+1,a[i])-b;
            root[i]=modify(root[i-1],1,q);
        }
        for(int i=1;i<=m;i++)
        {
            scanf("%d%d%d",&l,&r,&k);
            ans=query(root[l-1],root[r],1,q,k);
            printf("%d
    ",b[ans]);
        }
        return 0;
    }
  • 相关阅读:
    要离职了。
    上海找工作经历
    1.6. 三基色LED
    1.5. 板载LED PWM模式
    1.4. 板载LED控制
    1.3. 硬件篇之IO口(视频连接)
    1.2 Hello World
    1.8. 数码管
    ESP32编译自己的micropython固件
    1.1 准备工作
  • 原文地址:https://www.cnblogs.com/LJB666/p/10999435.html
Copyright © 2020-2023  润新知