代码:
#include<bits/stdc++.h>
using namespace std;
#define R register
#define ri register int
#define ll long long
#define ull unsigned long long
#define lid tree[id].bl
#define rid tree[id].br
void swap(int &x,int &y){int t=x;x=y;y=t;}
inline int max(int x,int y){return x>y?x:y;}
inline int min(int x,int y){return x<y?x:y;}
inline int read();
inline void write(int ans);
inline void put(int x,char c);
const int N=1e6+1;
int n,m;
int a[N];
struct sa{
int l,r,bl,br;
int val;
}tree[N<<5];
int root[N*3];
int top;
int build(int id,int l,int r){
id=++top;
tree[id].l=l,tree[id].r=r;
if(l==r){
tree[id].val=a[l];
return id;
}
int mid=l+r>>1;
lid=build(lid,l,mid);
rid=build(rid,mid+1,r);
return id;
}
int query(int id,int x){
if(tree[id].l==tree[id].r)return tree[id].val;
int mid=tree[id].l+tree[id].r>>1;
if(x<=mid)return query(lid,x);
else query(rid,x);
}
int update(int id,int x,int k){
tree[++top]=tree[id];
id=top;
if(tree[id].l==tree[id].r){
tree[id].val=k;
}
else{
int mid=tree[id].l+tree[id].r>>1;
if(x<=mid){
lid=update(lid,x,k);
}
else{
rid=update(rid,x,k);
}
}
return id;
}
signed main(){
n=read(),m=read();
for(int i=1;i<=n;i++)a[i]=read();
root[0]=build(1,1,n);
for(int i=1;i<=m;i++){
int use=read(),op=read();
if(op==1){
int x=read(),k=read();
root[i]=update(root[use],x,k);
}
else{
int x=read();
put(query(root[use],x),'\n');
root[i]=root[use];
}
}
return 0;
}
inline int read(){int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}return x*f;}
inline void write(int x){if(x<0){putchar('-');x=-x;}if(x>9){write(x/10);}putchar(x % 10+'0');return;}
inline void put(int x,char c){write(x);putchar(c);return;}
求大佬帮调