模板代码:
#include<bits/stdc++.h> using namespace std; typedef long long LL; #define mid ((l+r)>>1) const int INF=1e9+7,MAXNODE=24e6+7,MAXN=1e6+7; int N,M,tmp[MAXN],rt[MAXN]; int val[MAXNODE],lson[MAXNODE],rson[MAXNODE],sz; void init(int &x,int l,int r){ x=++sz; if(l==r){ val[x]=tmp[l]; return; } init(lson[x],l,mid); init(rson[x],mid+1,r); } void modify(int &x,int l,int r,int p,int q,int v){ x=++sz; if(l==r){ val[x]=v; return; } lson[x]=lson[p]; rson[x]=rson[p]; val[x]=val[p]; if(q<=mid) modify(lson[x],l,mid,lson[p],q,v); else modify(rson[x],mid+1,r,rson[p],q,v); } int query(int x,int l,int r,int q){ if(l==r) return val[x]; if(q<=mid) return query(lson[x],l,mid,q); return query(rson[x],mid+1,r,q); } int main(){ scanf("%d%d",&N,&M); for(int i=1;i<=N;i++) scanf("%d",tmp+i); init(rt[0],1,N); for(int i=1;i<=M;i++){ int edit/*edition*/,oper,loc/*location*/,v/*value*/; scanf("%d%d%d",&edit,&oper,&loc); if(oper==1){ scanf("%d",&v); modify(rt[i],1,N,rt[edit],loc,v); }else{ printf("%d\n",query(rt[edit],1,N,loc)); rt[i]=rt[edit]; } } return 0; }