• 不带修改的主席树


    #include<map>
    #include<stdio.h>
    #include<string.h>
    #include<vector>
    #include<algorithm>
    #include<iostream>
    using namespace std;
    const int maxn=2e5*19;
    int vis[maxn];
    int a[maxn],b[maxn];
    struct node1
    {
        int l,r,sum;
    }T[maxn];
    int cnt;vector<int>v;
    int root[300000];
    int get(int x)
    {
        return lower_bound(v.begin(),v.end(),x)-v.begin()+1;
    }
    
    void update(int l,int r,int& x,int y,int pos)
    {
        T[++cnt]=T[y];T[cnt].sum++;x=cnt;
        if(l==r) return;
        long long mid=(l+r)>>1;
        if(mid>=pos) update(l,mid,T[x].l,T[y].l,pos);
        else update(mid+1,r,T[x].r,T[y].r,pos);
    }
    
    int query(int l,int r,int x,int y,int pos)
    {
        if(l==r) return l;
        long long mid=(r+l)>>1;
        long long sum=T[T[y].l].sum-T[T[x].l].sum;
        if(sum>=pos) return query(l,mid,T[x].l,T[y].l,pos);
        else return query(mid+1,r,T[x].r,T[y].r,pos-sum);
    }
    int main()
    {
        int n,q;
        scanf("%d%d",&n,&q);
        for(int i=1;i<=n;i++)
        {
            scanf("%d",&a[i]);
            v.push_back(a[i]);
        }
        sort(v.begin(),v.end());
        v.erase(unique(v.begin(),v.end()),v.end());
    
        for(int i=1;i<=n;i++)
        {
            update(1,n,root[i],root[i-1],get(a[i]));
        }
        while(q--)
        {
            int x,y,k;
            scanf("%d%d%d",&x,&y,&k);
            printf("%d
    ",v[query(1,n,root[x-1],root[y],k)-1]);
        }
    }
    

      

  • 相关阅读:
    安卓系统
    移动互联网产品设计的原则
    Java 笔记10
    Get Android Source Code
    Spinner Animation
    Java 笔记09
    Java 笔记07
    Java 笔记08
    例题
    例题
  • 原文地址:https://www.cnblogs.com/Heilce/p/7260511.html
Copyright © 2020-2023  润新知