• Luogu P3919 【模板】可持久化数组 可持久化线段树


    其实就是可持久化线段树的模板题
    线段树不会看这里

    #include<bits/stdc++.h>
    const int N=1000005;
    using namespace std;
    int a[N],n,m,q,rt[N*20];
    int lc[N*20],rc[N*20],val[N*20],cnt;
    int rd(){
        register int f=1,x=0;register char ch;
        do{ch=getchar();if(ch=='-')f=-1;}while(ch<'0' or ch>'9');
        do{x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}while(ch>='0' and ch<='9');
        return f*x;
    }
    void build(int &o,int l,int r){
        o=++cnt;
        if(l==r){
            val[o]=a[l];
            return;
        }
        int mid=(l+r)>>1;
        build(lc[o],l,mid);build(rc[o],mid+1,r);
    }
    void insert(int &o,int pre,int l,int r,int q,int v){
        o=++cnt;lc[o]=lc[pre];rc[o]=rc[pre];val[o]=val[pre];
        if(l==r){
            val[o]=v;
            return;
        }
        int mid=(l+r)>>1;
        if(q<=mid)insert(lc[o],lc[pre],l,mid,q,v);
        else insert(rc[o],rc[pre],mid+1,r,q,v);
    }
    int query(int o,int l,int r,int q){
        if(l==r)return val[o];    
        int mid=(l+r)>>1;
        if(q<=mid)
            return query(lc[o],l,mid,q);
        else return query(rc[o],mid+1,r,q);
    }
    int main(){
        n=rd();m=rd();
        for(int i=1;i<=n;i++)
            a[i]=rd();
        build(rt[0],1,n);
        for(int i=1;i<=m;i++){
            int pre=rd(),opt=rd(),x=rd();
            if(opt==1){
                int v=rd();
                insert(rt[i],rt[pre],1,n,x,v);
            }else{
                printf("%d
    ",query(rt[pre],1,n,x));
                rt[i]=rt[pre];
            }
        }
    }
     
  • 相关阅读:
    Celery
    MongoDB-简介
    人工智障
    Flask-session,WTForms,POOL,Websocket通讯原理 -握手,加密解密过程
    web-socket
    flask基础2
    flask的基础1
    项目部署
    nginx简单学习
    redis的安装与配置
  • 原文地址:https://www.cnblogs.com/ezoihy/p/8898248.html
Copyright © 2020-2023  润新知