首先,谢谢各大佬可以点进来
真萌新学主席树,照着题解来的,但由于本菜鸡比较(~ ̄(OO) ̄)ブ,样例都没过,
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=1e8,N=1e6;
int t,top,a[N],n,m,root[N],rt,mode,x,y;
struct qwe{
int l,r,val;
}tr[maxn];
int clone(int t){
top++;
tr[top]=tr[t];
return top;
}
int maketree(int t,int l,int r){
t=++top;
if(l==r){
tr[t].val=a[l];
return top;
}
int mid=(l+r)>>1;
tr[t].l=maketree(tr[t].l,l,mid);
tr[t].r=maketree(tr[t].r,mid+1,r);
return t;
}
int update(int t,int l,int r,int x,int z){
t=clone(t);
if(l==r){
tr[t].val=z;
return t;
}
int mid=(l+r)>>1;
if(x<=mid) tr[t].l=update(tr[t].l,l,mid,x,z);
if(x>mid) tr[t].r=update(tr[t].r,mid+1,r,x,z);
return t;
}
int cha(int t,int l,int r,int x){
if(l==r) return tr[t].val;
int mid=(l+r)>>1;
if(x<=mid) cha(tr[t].l,l,mid,x);
if(x>mid) cha(tr[t].r,mid+1,r,x);
}
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
root[0]=maketree(0,1,n);
for(int i=1;i<=m;i++){
scanf("%d%d%d",&rt,&mode,&x);
if(mode==1){
scanf("%d",&y);
root[i]=update(root[rt],1,n,x,y);
}
else{
printf("%d\n",cha(root[rt],1,n,x));
root[i]=root[rt];
}
}
return 0;
}