主席树

这只是一个模板...具体算法qsc已经讲的很清楚了(QAQ)

模板链接

代码

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<cctype>
#include<cmath>
#include<cstdlib>
#include<queue>
#include<ctime>
#include<vector>
#include<set>
#include<map>
#include<stack>
using namespace std;
struct node {
      int l,r,sum;
}d[8400000];
int a[210000],b[210000],cnt,root[210000],tot;
map<int,int>id;
map<int,int>wh;
void update(int le,int ri,int &x,int y,int pos){
      d[++cnt]=d[y];
      d[cnt].sum++;
      x=cnt;
      if(le==ri)return;
      int mid=(le+ri)>>1;
      if(mid>=pos)update(le,mid,d[x].l,d[y].l,pos);
        else update(mid+1,ri,d[x].r,d[y].r,pos);
}
int que(int le,int ri,int x,int y,int k){
      if(le==ri)return le;
      int mid=(le+ri)>>1;
      int s=d[d[y].l].sum-d[d[x].l].sum;
      if(s>=k)return que(le,mid,d[x].l,d[y].l,k);
        else return que(mid+1,ri,d[x].r,d[y].r,k-s);
}
int main()
{     int n,m,i,j,k,x,y;
      scanf("%d%d",&n,&m);
      for(i=1;i<=n;i++){
         scanf("%d",&a[i]);
         b[i]=a[i];
      }
      sort(b+1,b+1+n);
      for(i=1;i<=n;i++)
         if(!id[b[i]]){
             id[b[i]]=++tot;
             wh[tot]=b[i];
         }
      for(i=1;i<=n;i++)update(1,n,root[i],root[i-1],id[a[i]]);
      for(i=1;i<=m;i++){
           scanf("%d%d%d",&x,&y,&k);
           printf("%d ",wh[que(1,n,root[x-1],root[y],k)]);
      }
      return 0;
}

原文地址:https://www.cnblogs.com/yzxverygood/p/9056320.html