可持久化数组模板

#include<bits/stdc++.h>
using namespace std;

const int MAXN=1e6+2333;

int n,m;
int a[MAXN];

struct Persistable_Segment_Tree{
    struct Node{
        int val,L,R;
    }t[MAXN*20];
    int cnt,rt[MAXN*20];
    void build_tree(int &root,int l,int r){
        root=++cnt;
        if (l==r) return (void)(t[root].val=a[l]);
        int mid=l+r>>1;
        build_tree(t[root].L,l,mid);
        build_tree(t[root].R,mid+1,r);
    }
    void update(int &root,int las,int l,int r,int q,int opt){
        root=++cnt;
        t[root]=t[las];
        if (l==r) return (void)(t[root].val=opt);
        int mid=l+r>>1;
        if (q<=mid) update(t[root].L,t[las].L,l,mid,q,opt);
        else update(t[root].R,t[las].R,mid+1,r,q,opt);
    }
    int query(int root,int l,int r,int q){
        if (l==r) return t[root].val;
        int mid=l+r>>1;
        if (q<=mid) return query(t[root].L,l,mid,q);
        else return query(t[root].R,mid+1,r,q);
    }
}T;

int read(){
    int x=0,f=1; char ch=getchar();
    while (!isdigit(ch)){ if (ch=='-') f=-1; ch=getchar(); }
    while (isdigit(ch)) x=x*10+ch-'0',ch=getchar(); return x*f;
}

int main(){
    n=read(),m=read();
    for (int i=1;i<=n;i++) a[i]=read();
    T.cnt=0,T.build_tree(T.rt[0],1,n);
    int x,opt,y,z;
    for (int i=1;i<=m;i++){
        x=read(),opt=read();
        if (opt==1){
            y=read(),z=read();
            T.update(T.rt[i],T.rt[x],1,n,y,z);
        }
        else {
            y=read();
            T.rt[i]=T.rt[x];
            printf("%d\n",T.query(T.rt[x],1,n,y));
        }
    }
    return 0;
}

 

posted @ 2018-11-02 14:31  QingCai_DCF  阅读(108)  评论(0编辑  收藏  举报