RT
#include<bits/stdc++.h>
using namespace std;
long long n,m,cnt,loc,valu;
struct TreePoint{
long long l,r,val;
}tre[24000010];
long long root[1000010],arr[1000010];
inline long long read(){
long long w=1,q=0;
char ch=' ';
while(ch!='-' && (ch<'0' || ch>'9')) ch=getchar();
if(ch=='-') w=-1,ch=getchar();
while(ch<='9' && ch>='0') q=(q<<1)+(q<<3)+ch-'0',ch=getchar();
return w*q;
}
int build(int l,int r,int p){
p=++cnt;
if(l==r){tre[p].val=arr[l];return p;}
int mid=l+((r-l)>>1);
tre[p].l=build(l,mid,tre[p].l);tre[p].r=build(mid+1,r,tre[p].r);
return p;
}
inline int clone(int p){
tre[++cnt]=tre[p];return cnt;
}
int update(int l,int r,int p){
p=clone(p);
if(l==r){tre[p].val=valu;return p;}
int mid=l+((r-l)>>1);
if(loc<=mid){ tre[p].l=update(l,mid,tre[p].l);}
if(loc>mid){ tre[p].r=update(mid+1,r,tre[p].r);}
return p;
}
long long vis(int l,int r,int p){
if(l==r){return tre[p].val;}
int mid=l+((r-l)>>1);
if(loc<=mid){return vis(l,mid,tre[p].l);}
if(loc>mid){return vis(mid+1,r,tre[p].r);}
}
int main(){
n=read();m=read();
for(int i=1; i<=n; i++) arr[i]=read();
root[0]=build(1,n,0);
int vs,op;
for(int i=1; i<=m; i++){
vs=read(),op=read();
if(op==1){
loc=read();valu=read();
root[i]=update(1,n,root[vs]);
}else{
loc=read();root[i]=root[vs];
cout<<vis(1,n,root[vs])<<endl;
}
}
}
改了半天,不是MLE就是RE,WA,关键下不了测试点