#include<iostream>
#include<cstdio>
#define reint register int
using namespace std;
int n,m;
inline void read(int &a) {
int x(0),y(1);
char c=getchar();
while(c<'0'||c>'9') {
if(c=='-')y=-1;
c=getchar();
}
while(c>='0'&&c<='9') {
x=(x<<1)+(x<<3)+(c^48);
c=getchar();
}
a=x*y;
return;
}
inline void write(int x) {
if(x<0) {
putchar('-');
x=-x;
write(x);
} else {
if(x>9) {
write(x/10);
}
putchar(x%10+'0');
}
}
int s[1000005],v,loc,value,p,root[1000005],top;
struct nod {
int l,r,val;
} tree[20000005];
int add(int node) {
++top;
tree[top]=tree[node];
return top;
}
int update(int node,int l,int r,int loc,int valus) {
node=add(node);
if(l==r) {
tree[l].val=valus;
} else {
int mid=(l+r)>>1;
if(loc<=mid) {
tree[node].l=update(tree[node].l,l,mid,loc,valus);
} else {
tree[node].r=update(tree[node].r,mid+1,r,loc,valus);
}
}
return node;
}
int build(int node,int l,int r) {
node=++top;
if(l==r) {
tree[node].val=s[l];
return top;
}
int mid=(l+r)>>1;
tree[node].l=build(tree[node].l,l,mid);
tree[node].r=build(tree[node].r,mid+1,r);
return node;
}
int query(int node,int l,int r,int loc) {
if(l==r) {
return tree[node].val;
} else {
int mid=(l+r)>>1;
if(loc<=mid)
return query(tree[node].l,l,mid,loc);
else
return query(tree[node].r,mid+1,r,loc);
}
}
int main() {
reint i;
scanf("%d",&n);
scanf("%d",&m);
for(i=1; i<=n; ++i) {
scanf("%d",&s[i]);
}
root[0]=build(0,1,n);
for(i=1; i<=m; ++i) {
scanf("%d",&v);
scanf("%d",&p);
scanf("%d",&loc);
if(p==1) {
scanf("%d",&value);
root[i]=update(root[v],1,n,loc,value);
} else {
printf("%d",query(root[v],1,n,loc));
root[i]=root[v];
putchar('\n');
}
}
}
改了一上午了,以至于改的我觉得都和题解一模一样了,还是全WA,有没有哪位大佬能帮忙看看是哪里的问题?谢谢!