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

时间:2023-03-09 16:49:17
【洛谷】P3919 【模板】可持久化线段树(主席树)

题目

传送门:QWQ

分析

主席树的模板,囤着


代码

#include <bits/stdc++.h>
using namespace std;
const int N=;
int ls[N*], rs[N*], root[N*], newp, sum[N*], a[N*]; 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>>;
if(pos<=mid) insert(l,mid,x,pos,ls[cur],ls[cur1]);
else insert(mid+,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>>;
build(l,mid,ls[cur]); build(mid+,r,rs[cur]);
} inline int query(int l,int r,int pos,int cur)
{
if(l==r) return sum[cur];
int mid=l+r>>;
if(pos<=mid) return query(l,mid,pos,ls[cur]);
else return query(mid+,r,pos,rs[cur]);
} int main()
{
int n,m;
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++) scanf("%d",&a[i]);
build(,n,root[]); int v1,opt,x,pos;
for(int i=;i<=m;i++)
{
scanf("%d%d",&v1,&opt);
root[i]=root[v1];
if(opt==){
scanf("%d%d",&pos,&x);
insert(,n,x,pos,root[i],root[i]);
}
else{
scanf("%d",&pos);
printf("%d\n",query(,n,pos,root[v1]));
}
}
return ;
}