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