卡常卡不下去了,不想用快读与快写。
#include<bits/stdc++.h>
using namespace std;
int n,m;
struct node{
node *l,*r;
int val;
}*root[int(1e6)+10];
int tot;
node *null;
void _init(){
tot=0;
null=new node;
null->l=null->r=null;
null->val=0;
}
inline node *build(int a[],int l,int r){
if(l==r){
node *p=new node;
p->l=p->r=null;
p->val=a[l];
return p;
}
int mid=l+r>>1;
node *p=new node;
p->l=build(a,l,mid);
p->r=build(a,mid+1,r);
p->val=p->l->val+p->r->val;
return p;
}
void creat(int a[],int l=1,int r=n){
_init();
root[tot]=build(a,l,r);
}
inline node *update(int x,int k,node *p,int l=1,int r=n){//单点修改
if(l==r && r==x){
register node *q=new node;
q->l=q->r=null;
q->val=k;
return q;
}
register node *q=new node;
q->l=p->l,q->r=p->r;
register int mid=l+r>>1;
if(x>=l && x<=mid) q->l=update(x,k,p->l,l,mid);
else q->r=update(x,k,p->r,mid+1,r);
q->val=q->l->val+q->r->val;
return q;
}
inline int ask(int x,node *p,int l=1,int r=n){//单点查询
if(l==r && r==x) return p->val;
register int mid=l+r>>1;
if(x>=l && x<=mid) return ask(x,p->l,l,mid);
else return ask(x,p->r,mid+1,r);
}
int a[int(1e6)+10];
int main() {
cin>>n>>m;
for(int *i=a+1;i<=a+n;i++)
scanf("%d",i);
creat(a);
while(m--){
register int v,opt;
scanf("%d%d",&v,&opt);
if(opt==1){
register int x,k;
scanf("%d%d",&x,&k);
root[++tot]=update(x,k,root[v]);
}
else{
register int x;
scanf("%d",&x);
printf("%d\n",ask(x,root[v]));
root[++tot]=root[v];
}
}
return 0;
}