其他分享
首页 > 其他分享> > LGOJ P3919【模板】可持久化数组(可持久化线段树/平衡树)

LGOJ P3919【模板】可持久化数组(可持久化线段树/平衡树)

作者:互联网

代码

  1 #include <cstdio>
  2 using namespace std;
  3 
  4 struct node
  5 {
  6     node *Lnode,*Rnode;
  7     int val;
  8     
  9     void clone(node* N)
 10     {
 11         Lnode=N->Lnode;
 12         Rnode=N->Rnode;
 13         val=N->val;
 14         
 15         return;
 16     }
 17 }tree[20000005],*root[1000005],*tail=tree;
 18 int a[1000005];
 19 
 20 node* build(int L,int R)
 21 {
 22     node *O=(++tail);
 23     
 24     if(L==R)
 25     {
 26         O->val=a[L];
 27         
 28         return O;
 29     }
 30     
 31     int M=(L+R)>>1;
 32     
 33     O->Lnode=build(L,M);
 34     O->Rnode=build(M+1,R);
 35     
 36     return O;
 37 }
 38 
 39 node* modify(node* N,int L,int R,int pos,int val)
 40 {
 41     node *O=(++tail);
 42     
 43     O->clone(N);
 44     if(L==R)
 45     {
 46         O->val=val;
 47         
 48         return O;
 49     }
 50     
 51     int M=(L+R)>>1;
 52     
 53     if(pos<=M) O->Lnode=modify(N->Lnode,L,M,pos,val);
 54     else O->Rnode=modify(N->Rnode,M+1,R,pos,val);
 55     
 56     return O;
 57 }
 58 
 59 int query(node* N,int L,int R,int pos)
 60 {
 61     if(L==R) return N->val;
 62     
 63     int M=(L+R)>>1;
 64     
 65     if(pos<=M) return query(N->Lnode,L,M,pos);
 66     return query(N->Rnode,M+1,R,pos);
 67 }
 68 
 69 int main()
 70 {
 71     int n,m;
 72     
 73     scanf("%d%d",&n,&m);
 74     for(int i=1;i<=n;i++) scanf("%d",&a[i]);
 75     
 76     root[0]=build(1,n);
 77     for(int i=1;i<=m;i++)
 78     {
 79         int v,opt,loc;
 80         
 81         scanf("%d%d%d",&v,&opt,&loc);
 82         
 83         if(opt==1)
 84         {
 85             int val;
 86             
 87             scanf("%d",&val);
 88             
 89             root[i]=modify(root[v],1,n,loc,val);
 90         }
 91         else
 92         {
 93             printf("%d\n",query(root[v],1,n,loc));
 94             
 95             root[i]=root[v];
 96         }
 97     }
 98     
 99     return 0;
100 }
 

 

标签:node,持久,val,int,pos,Rnode,return,LGOJ,P3919
来源: https://www.cnblogs.com/C-C-C-P/p/10391611.html