注释部分感觉写的没什么大区别,但是就是过不了
#include <bits/stdc++.h>
typedef long long ll;
using namespace std;
template<typename T>inline T read(){
T a=0;bool s=0;
char ch=getchar();
while(ch>'9' || ch<'0'){
if(ch=='-')s^=1;
ch=getchar();
}
while(ch>='0' && ch<='9'){
a=(a<<3)+(a<<1)+(ch^48);
ch=getchar();
}
return s?-a:a;
}
const int mn=1e6+10;
int n,m,tot,a[mn],root[mn];
struct stree{
int l,r,lc,rc,dat;
#define l(x) tr[x].l
#define r(x) tr[x].r
#define lc(x) tr[x].lc
#define rc(x) tr[x].rc
#define dat(x) tr[x].dat
}tr[mn*30];
void build(int &now,int l,int r){
now=++tot;
l(now)=l;r(now)=r;
if(l==r){
dat(now)=a[l];
return;
}
int mid=l+r>>1;
build(lc(now),l,mid);
build(rc(now),mid+1,r);
}
// void cg(int &now,int las,int o,int num){
// now=++tot;dat(now)=dat(las);
// lc(now)=lc(las);rc(now)=rc(las);
// if(l(now)==r(now)){dat(now)=num;return;}
// int mid=l(now)+r(now)>>1;
// if(o<=mid)cg(lc(now),lc(las),o,num);
// else cg(rc(now),rc(las),o,num);
// }
// int ask(int now,int o){
// if(l(now)==r(now))return dat(now);
// int mid=l(now)+r(now)>>1;
// if(o<=mid)return ask(lc(now),o);
// else return ask(rc(now),o);
// }
void cg(int &now,int las,int o,int l,int r,int val){
now=++tot;
dat(now)=dat(las);
lc(now)=lc(las);rc(now)=rc(las);
if(l==r){dat(now)=val;return;}
int mid=(l+r)>>1;
if(o<=mid)cg(lc(now),lc(las),o,l,mid,val);
else cg(rc(now),rc(las),o,mid+1,r,val);
}
int ask(int now,int l,int r,int o){
if(l==r)return dat(now);
int mid=(l+r)>>1;
if(o<=mid)return ask(lc(now),l,mid,o);
else return ask(rc(now),mid+1,r,o);
}
int main(){
n=read<int>();m=read<int>();
for(int i=1;i<=n;i++)
a[i]=read<int>();
build(root[0],1,n);
for(int i=1;i<=m;i++){
int k=read<int>();
int op=read<int>(),num=read<int>();
if(op==1)cg(root[i],root[k],num,1,n,read<int>());
else printf("%d\n",ask(root[k],1,n,num)),root[i]=root[k];
}
// while(1)getchar();
return 0;
}