rt,操作2有开新版本
#include<bits/stdc++.h>
using namespace std;
int a[1000010],root[1000010];
struct dian{
int l,r,val;
}pt[100000010];
int n,m,cnt,c;
void build(int l,int r,int point){
cnt++;
if(l==r){
pt[point].val=a[++c];
return;
}
int mid=(l+r)>>1;
build(l,mid,point<<1);
build(mid+1,r,(point<<1)+1);
pt[point].l=point<<1;
pt[point].r=(point<<1)+1;
pt[point].val=pt[point<<1].val+pt[(point<<1)+1].val;
return;
}
int change(int l,int r,int lo,int va,int point){
cnt++;pt[cnt]=pt[point];
int p=cnt;
if(l==r){
pt[cnt].val=va;
// cout<<pt[cnt].val<<' ';
return cnt;
}
int mid=(l+r)>>1;
if(lo<=mid)pt[p].l=change(l,mid,lo,va,pt[point].l);
else pt[p].r=change(mid+1,r,lo,va,pt[point].r);
pt[p].val=pt[pt[p].l].val+pt[pt[p].r].val;
// cout<<pt[p].val<<' '<<p<<' '<<l<<' '<<r<<' '<<pt[pt[p].l].val<<' '<<pt[pt[p].r].val<<endl;;
return p;
}
int check(int l,int r,int lo,int point){
cnt++;pt[cnt]=pt[point];
int p=cnt;
if(l==r){
printf("%d\n",pt[p].val);
return cnt;
}
int mid=(l+r)>>1;
if(lo<=mid)pt[p].l=check(l,mid,lo,pt[point].l);
else pt[p].r=check(mid+1,r,lo,pt[point].r);
return p;
}
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
}
build(1,n,1);
root[0]=1;
for(int i=1;i<=m;i++){
int v,c,lo,va;
scanf("%d%d",&v,&c);
switch(c){
case 1:{
scanf("%d%d",&lo,&va);
root[i]=change(1,n,lo,va,root[v]);
// cout<<pt[root[i]].val;
break;
}
case 2:{
scanf("%d",&lo);
root[i]=check(1,n,lo,root[v]);
break;
}
}
}
return 0;
}