AlenaNuna

导航

LuoguP3834 【模板】可持久化线段树 1(主席树)|| 离散化

题目:【模板】可持久化线段树 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

posted on 2019-02-17 14:01  AlenaNuna  阅读(192)  评论(0编辑  收藏  举报