#1和后面几个点全挂了,Re还能理解,wa就不知道了
求助啊
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
void read(int &x){
char c=getchar();
int k=1;
while(c<'0'||c>'9') {if(c=='-') k=-1;c=getchar();}
for(x=0;c>='0'&&c<='9';c=getchar())
x=x*10+c-'0';
x*=k;
}
const int N=1000005;
int n,m,a[N],x,l,r,s,ans,k,q,top,root[N];
struct kkk{
int l,r,val;
}tree[N];
int clone(int node){//新建节点
top++;
tree[top]=tree[node];
return top;
}
int maketree(int node,int l,int r){
node=++top;
if(l==r){
tree[node].val=a[l];return top;
}
int mid=l+r>>1;
tree[node].l=maketree(tree[node].l,l,mid);
tree[node].r=maketree(tree[node].r,mid+1,r);
return node;
}
int update(int k,int l,int r,int x,int val){
k=clone(k);
if(l==r){
tree[k].val=val;return k;
}
int mid=l+r>>1;
if(x<=mid){
tree[k].l=update(tree[k].l,l,mid,x,val);
}
else{
tree[k].r=update(tree[k].r,mid+1,r,x,val);
}
return k;
}
int query(int k,int l,int r,int x){
if(l==r) return tree[k].val;
int mid=l+r>>1;
if(x<=mid){
return query(tree[k].l,l,mid,x);
}
else return query(tree[k].r,mid+1,r,x);
}
int main(){
read(n);read(m);
for(int i=1;i<=n;i++){
read(a[i]);
}
root[0]=maketree(0,1,n);
for(int i=1;i<=m;++i){
read(l);read(k);read(r);
if(k==1){
read(x);
root[i]=update(root[l],1,n,r,x);
}
else{
printf("%d\n",query(root[l],1,n,r));
root[i]=root[l];
}
}
return 0;
}