样例要么正常,要么输出0
#include<bits/stdc++.h>
#define int long long
using namespace std;
struct node{
int ls,rs,val;
}tree[1000005<<2];
int cnt=1;
int a[1000005];
int root[1000005];
inline void pushup(int p){
tree[p].val=tree[p<<1].val+tree[p<<1|1].val;
}
void build(int p,int l,int r){
if(l==r){
tree[p].val=a[l];
return;
}
tree[p].ls=++cnt;
tree[p].rs=++cnt;
int mid=l+r>>1;
build(tree[p].ls,l,mid);
build(tree[p].rs,mid+1,r);
pushup(p);
}
int update(int p,int l,int r,int chg,int k){
if(l==r&&l==chg){
tree[++cnt].val=k;
return cnt;
}
int mid=l+r>>1;
tree[++cnt]=tree[p];
if(mid>=chg){
tree[cnt].ls=update(tree[p].ls,l,mid,chg,k);
}
else{
tree[cnt].rs=update(tree[p].rs,mid+1,r,chg,k);
}
}
int query(int p,int l,int r,int chg){
if(l==r&&l==chg){
return tree[p].val;
}
int mid=l+r>>1;
if(mid>=chg){
return query(tree[p].ls,l,mid,chg);
}
else{
return query(tree[p].rs,mid+1,r,chg);
}
}
signed main(){
ios::sync_with_stdio(false);
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++)cin>>a[i];
build(1,1,n);
root[0]=1;
int now=0;
while(m--){
int v,op,loc;
cin>>v>>op>>loc;
// cout<<root[v]<<"|ASD"<<endl;
// cout<<cnt<<"|"<<endl;
if(op==1){
int val;
cin>>val;
update(root[v],1,n,loc,val);
root[++now]=cnt;
}
else{
cout<<query(root[v],1,n,loc)<<endl;
root[++now]=root[v];
}
}
return 0;
}