改了几个一眼错,40 了
```cpp
#include<bits/stdc++.h>
using namespace std;
struct edge{
int l,r,val;
}y[53000000];
int root[1000005];
int x[1000005];
int top=0;
void build(int now,int l,int r){
if(l==r){
y[now].val=x[l];
return;
}
int mid=(l+r)/2;
top++;
y[now].l=top;
build(top,l,mid);
top++;
y[now].r=top;
build(top,mid+1,r);
return;
}
void up(int now,int had,int l,int r,int a,int p){
if(l==r&&l==a){
y[now].val=p;
return;
}
int mid=(l+r)/2;
if(a<=mid){
top++;
y[now].l=top;
y[now].r=y[had].r;
up(top,y[had].l,l,mid,a,p);
}
else{
top++;
y[now].l=y[had].l;
y[now].r=top;
up(top,y[had].r,mid+1,r,a,p);
}
//cout<<y[now].l<<' '<<y[now].r<<endl;
return;
}
int down(int now,int l,int r,int a){
//cout<<l<<' '<<r<<' '<<a<<endl;
if(l==r&&l==a)return y[now].val;
int mid=(l+r)/2;
if(a<=mid)return down(y[now].l,l,mid,a);
else return down(y[now].r,mid+1,r,a);
}
int main(){
int n,m;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)scanf("%d",&x[i]);
build(0,1,n);
for(int i=1;i<=m;i++){
int kind,num,got;
scanf("%d%d%d",&num,&kind,&got);
if(kind==1){
int go;
scanf("%d",&go);
top++;
root[i]=top;
//cout<<top<<' '<<now<<endl;
up(top,root[num],1,n,got,go);
}
else{
root[i]=root[i-1];
printf("%d\n",down(root[num],1,n,got));
}
}
return 0;
}
```
by Iniaugoty @ 2024-04-07 22:42:12
@[Iniaugoty](/user/768612) 我擦怎么是你啊
by 20220621Soren @ 2024-04-08 19:57:59
@[Iniaugoty](/user/768612) 你自己造了一个一眼错
```cpp
root[i]=root[i-1];
```
应该是
```cpp
root[i]=root[num];
```
(我们老师改的)
by 20220621Soren @ 2024-04-09 09:27:26
改完就对了,此贴结(拜谢 @[Iniaugoty](/user/768612) 和教练 @ SKT_Crush)
by 20220621Soren @ 2024-04-09 09:29:08