写得答辩一样,能参考一下同样做法的代码吗?
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+55;
struct awa{
int l,r,val;
}tree[maxn];
int top=1;
int clone(int k){
top++;
tree[top]=tree[k];
return top;
}
int a[maxn];
int maketree(int k,int begin,int end){
k=++top;
if(begin==end){
tree[k].val=a[begin];
return top;
}
int mid=(begin+end)>>1;
tree[k].l=maketree(tree[k].l,begin,mid);
tree[k].r=maketree(tree[k].r,mid+1,mid);
return k;
}
int update(int k,int be,int ed,int x,int val){
k=clone(k);
if(be==ed){
tree[k].val=val;
} else {
int mid=(be+ed)>>1;
if(x<=mid){
tree[k].l=update(tree[k].l,be,mid,x,val);
} else {
tree[k].r=update(tree[k].r,mid+1,ed,x,val);
}
}
return k;
}
int query(int k,int be,int ed,int x){
if(be==ed){
return tree[k].val;
} else {
int mid=(be+ed)>>1;
if(x<=mid){
return query(tree[k].l,be,mid,x);
} else {
return query(tree[k].r,mid+1,ed,x);
}
}
}
int root[maxn];
signed main(void){
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>a[i];
}
int tr,mode,x,y,rt=1;
root[0]=maketree(0,1,n);
for(int i=1;i<=m;i++){
cin>>tr>>mode>>x;
if(mode==1){
cin>>y;
root[i]=update(root[rt],1,n,x,y);
} else {
printf("%\n",query(root[rt],1,n,x));
root[i]=root[rt];
}
}
return 0;
}