1. 程式人生 > >LGOJ P3919【模板】可持久化數組(可持久化線段樹/平衡樹)

LGOJ P3919【模板】可持久化數組(可持久化線段樹/平衡樹)

oot cst node std 可持久化線段樹 printf clas modify odi

代碼

  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 }

LGOJ P3919【模板】可持久化數組(可持久化線段樹/平衡樹)