可持久化数组

#include<iostream>
#include<cstdio>
#include<cstdlib>
#define maxn 1000010
using namespace std;
template<typename T>
inline void read(T &x){
    x=0;bool flag=0;char c=getchar();
    for(;!isdigit(c);c=getchar()) if(c=='-') flag=1;
    for(;isdigit(c);c=getchar()) x=x*10+(c^48);
    if(flag) x=-x;
} 

int n,m,a[maxn],num,v,loc,value;
int cnt,root[20*maxn],ls[20*maxn],rs[20*maxn],val[20*maxn];

void build(int &t,int l,int r){//注意要取地址 
    t=++cnt;
    if(l==r){
        val[t]=a[l];
        return ;
    }
    int mid=(l+r)/2;
    build(ls[t],l,mid);
    build(rs[t],mid+1,r);
}

void change(int &t,int k,int l,int r,int pos,int v){//注意要取地址 
    t=++cnt;
    ls[t]=ls[k];rs[t]=rs[k];val[t]=val[k];
    if(l==r){
        val[t]=v;
        return ;
    }
    int mid=(l+r)/2;
    if(pos<=mid) change(ls[t],ls[k],l,mid,pos,v);
    if(pos>mid) change(rs[t],rs[k],mid+1,r,pos,v);
}

int query(int t,int l,int r,int pos){
    if(l==r) return val[t];
    int mid=(l+r)/2;
    if(pos<=mid) return query(ls[t],l,mid,pos);
    if(pos>mid) return query(rs[t],mid+1,r,pos);
}

int main(){
    read(n),read(m);
    for(int i=1;i<=n;i++) read(a[i]);
    build(root[0],1,n);
    for(int i=1;i<=m;i++){
        read(v),read(num),read(loc);
        if(num==1){
            read(value);
            change(root[i],root[v],1,n,loc,value);
        }
        if(num==2){
            cout<<query(root[v],1,n,loc)<<endl;
            root[i]=root[v];
        }
    }
    return 0;
} 

 

posted @ 2021-02-23 11:57  DReamLion  阅读(27)  评论(0编辑  收藏  举报