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

时间:2024-09-02 12:07:38

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

#include<bits/stdc++.h>
const int N=;
using namespace std;
int a[N],n,m,q,rt[N*];
int lc[N*],rc[N*],val[N*],cnt;
int rd(){
register int f=,x=;register char ch;
do{ch=getchar();if(ch=='-')f=-;}while(ch<'' or ch>'');
do{x=(x<<)+(x<<)+ch-'';ch=getchar();}while(ch>='' and ch<='');
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)>>;
build(lc[o],l,mid);build(rc[o],mid+,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)>>;
if(q<=mid)insert(lc[o],lc[pre],l,mid,q,v);
else insert(rc[o],rc[pre],mid+,r,q,v);
}
int query(int o,int l,int r,int q){
if(l==r)return val[o];
int mid=(l+r)>>;
if(q<=mid)
return query(lc[o],l,mid,q);
else return query(rc[o],mid+,r,q);
}
int main(){
n=rd();m=rd();
for(int i=;i<=n;i++)
a[i]=rd();
build(rt[],,n);
for(int i=;i<=m;i++){
int pre=rd(),opt=rd(),x=rd();
if(opt==){
int v=rd();
insert(rt[i],rt[pre],,n,x,v);
}else{
printf("%d\n",query(rt[pre],,n,x));
rt[i]=rt[pre];
}
}
}