【洛谷】P3919 【模板】可持久化线段树(主席树)

题目

传送门:QWQ

分析

主席树的模板,囤着


代码

#include <bits/stdc++.h>
using namespace std;
const int N=1000010;
int ls[N*20], rs[N*20], root[N*20], newp, sum[N*20], a[N*20];

inline void insert(int l,int r,int x,int pos,int& cur,int cur1)
{
    cur=++newp;
    ls[cur]=ls[cur1]; rs[cur]=rs[cur1]; sum[cur]=sum[cur1];
    if(l==r) { sum[cur]=x; return; }
    int mid=l+r>>1;
    if(pos<=mid) insert(l,mid,x,pos,ls[cur],ls[cur1]);
    else insert(mid+1,r,x,pos,rs[cur],rs[cur1]);
}

inline void build(int l,int r,int& cur)
{
    cur=++newp;
    if(l==r) { sum[cur]=a[l]; return; }
    int mid=l+r>>1;
    build(l,mid,ls[cur]); build(mid+1,r,rs[cur]);
}

inline int query(int l,int r,int pos,int cur)
{
    if(l==r) return sum[cur];
    int mid=l+r>>1;
    if(pos<=mid) return query(l,mid,pos,ls[cur]);
    else return query(mid+1,r,pos,rs[cur]);
}

int main()
{
    int n,m;
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++) scanf("%d",&a[i]);
    build(1,n,root[0]);
    
    int v1,opt,x,pos;
    for(int i=1;i<=m;i++)
    {
         scanf("%d%d",&v1,&opt);
        root[i]=root[v1];
        if(opt==1){
            scanf("%d%d",&pos,&x);
            insert(1,n,x,pos,root[i],root[i]);
        }
        else{
            scanf("%d",&pos);
            printf("%d
",query(1,n,pos,root[v1]));
        }
    }
    return 0;
}
View Code
原文地址:https://www.cnblogs.com/noblex/p/8419928.html