模板代码:

#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;
}
View Code

相关文章: