\(Solution:\)
可持久化线段树模板题
我们使用元区间(即\(l==r\))来存储数组中的元素
\(Code:\)
#include<bits/stdc++.h>
using namespace std;
const int N=1e7+50;
int n,m,len,a[N],b[N],tmp,pre[N],rt[N],tot;
map<int,int> mp;
struct segtree
{
int ls,rs,val;
}tree[N<<4];
inline int read()
{
int val=0,f=1;
char ch=0;
while(!isdigit(ch))
{
if(ch=='-') f=-1;
ch=getchar();
}
while(isdigit(ch))
{
val=(val<<1)+(val<<3)+(ch^48);
ch=getchar();
}
return val*f;
}
inline int clone(int x)
{
tot++;
tree[tot]=tree[x];
return tot;
}
inline void pushup(int x)
{
tree[x].val=tree[tree[x].ls].val+tree[tree[x].rs].val;
}
inline int build(int t,int l,int r)
{
t=++tot;
if(l==r)
{
tree[t].val=a[l];
return tot;
}
int mid=(l+r)>>1;
tree[t].ls=build(tree[t].ls,l,mid);
tree[t].rs=build(tree[t].rs,mid+1,r);
return t;
}
inline int update(int x,int l,int r,int pos,int c)
{
x=clone(x);
if(l==r)
{
tree[x].val=c;
return x;
}
int mid=(l+r)>>1;
if(pos<=mid) tree[x].ls=update(tree[x].ls,l,mid,pos,c);
else tree[x].rs=update(tree[x].rs,mid+1,r,pos,c);
return x;
}
inline int query(int x,int l,int r,int pos)
{
if(l==r) return tree[x].val;
int mid=(l+r)>>1;
if(pos<=mid) return query(tree[x].ls,l,mid,pos);
return query(tree[x].rs,mid+1,r,pos);
}
int main(void)
{
n=read(),m=read();
for(int i=1;i<=n;i++) a[i]=read();
rt[0]=build(0,1,n);
for(int i=1;i<=m;i++)
{
int xxj=read(),op=read(),x=read();
if(op==1)
{
int y=read();
rt[i]=update(rt[xxj],1,n,x,y);
}
else
{
printf("%d\n",query(rt[xxj],1,n,x));
rt[i]=rt[xxj];
}
}
return 0;
}