洛谷P3919 题解

题目链接

\(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;
}
posted @ 2020-02-20 11:04  L_G_J  阅读(84)  评论(0编辑  收藏  举报