LuoguP3834 【模板】可持久化线段树 1(主席树)|| 离散化
不知道说啥。
1 #include<cstdio> 2 #include<cstring> 3 #include<iostream> 4 #include<algorithm> 5 using namespace std; 6 const int maxn=(2e5)+50,maxm=maxn; 7 int N,M,K,num_treenode=0,root[maxn],X,B[maxn],num=0,L,R,ans,F[maxn]; 8 inline int rd(){ 9 int x=0,f=1;char c=getchar(); 10 while(c<'0'||c>'9'){if(c=='-')f=-1; c=getchar();} 11 while(c>='0'&&c<='9'){x=x*10+c-'0'; c=getchar();} 12 return f*x; 13 } 14 struct Tree{ 15 int l,r,data,ls,rs; 16 }t[(maxn<<2)+maxm*19]; 17 struct Num{ 18 int id,data; 19 }A[maxn]; 20 inline void Build(int x,int l,int r){ 21 t[x].l=l;t[x].r=r; 22 if(l==r)return; 23 int mid=(l+r)>>1; 24 Build(t[x].ls=++num_treenode,l,mid); Build(t[x].rs=++num_treenode,mid+1,r); 25 return; 26 } 27 inline bool cmp(const Num&a,const Num&b){return(a.data<b.data);} 28 inline void Update(int u,int x,int q){ 29 int l,r,mid; 30 t[x].l=l=t[u].l;t[x].r=r=t[u].r;mid=(l+r)>>1; 31 if(l==r&&l==q){t[x].data=t[u].data+1; return;} 32 if(q<=mid){t[x].rs=t[u].rs; Update(t[u].ls,t[x].ls=++num_treenode,q);} 33 else{t[x].ls=t[u].ls; Update(t[u].rs,t[x].rs=++num_treenode,q);} 34 t[x].data=t[t[x].ls].data+t[t[x].rs].data; 35 return; 36 } 37 inline int Query(int r1,int r2,int k){ 38 int l=t[r1].l,r=t[r1].r,ls=t[r1].ls,rs=t[r1].rs,ls_=t[r2].ls,rs_=t[r2].rs,sum=t[ls_].data-t[ls].data; 39 if(l==r)return l; 40 if(k<=sum)return Query(ls,ls_,k);else return Query(rs,rs_,k-sum); 41 } 42 int main(){ 43 N=rd();M=rd(); 44 root[0]=++num_treenode; 45 Build(num_treenode,1,N); 46 for(int i=1;i<=N;i++){ 47 A[i].data=rd(); 48 A[i].id=i; 49 } 50 sort(A+1,A+N+1,cmp); 51 A[0].data=int(1e9); 52 for(int i=1;i<=N;i++) 53 if(A[i].data!=A[i-1].data) B[A[i].id]=++num,F[num]=A[i].data;else B[A[i].id]=num;//find是离散化后的数对应的原数是什么 54 for(int i=1;i<=N;i++)Update(root[i-1],root[i]=++num_treenode,B[i]); 55 while(M--){ 56 L=rd();R=rd();K=rd(); 57 ans=Query(root[L-1],root[R],K); 58 printf("%d\n",F[ans]); 59 } 60 return 0; 61 }
By:AlenaNuna