记录编号 454770 评测结果 AAAAAAAAAA
题目名称 可持久化线段树 最终得分 100
用户昵称 GravatarHzoi_QTY 是否通过 通过
代码语言 C++ 运行时间 0.351 s
提交时间 2017-09-29 16:53:02 内存使用 0.73 MiB
显示代码纯文本
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#define N 10005
using namespace std;
int n,m,tot=1,a[N];
namespace chairtree
{
	struct tree
	{
		tree* lc;tree* rc;
		int h;
		tree(){h=0;lc=rc=NULL;}
		void updata(){h=max(lc->h,rc->h);}
	}*null=new tree(),*root[N*10];
	tree* newtree()
	{
		tree* o=new tree();
		o->lc=o->rc=null;o->h=0;
		return o;
	}
	void build(int l,int r,tree* &x)
	{
		x=newtree();
		if(l==r){x->h=a[l];return;}
		int mid=l+r>>1;
		build(l,mid,x->lc);
		build(mid+1,r,x->rc);
		x->updata();
	}
	void insert(int l,int r,tree* &x,tree* pre,int h,int k)
	{	
		if(l==r){x=newtree();x->h=k;return;}
		int mid=l+r>>1;
		if(h<=mid)
		{
			x->lc=newtree();x->rc=pre->rc;
			insert(l,mid,x->lc,pre->lc,h,k);
		}
		else
		{
			x->lc=pre->lc;x->rc=newtree();
			insert(mid+1,r,x->rc,pre->rc,h,k);
		}
		x->updata();
	}
	int q(int L,int R,int l,int r,tree* x)
	{
		if(L>=l&&R<=r){return x->h;}
		int mid=L+R>>1,s=0;
		if(l<=mid)s=q(L,mid,l,r,x->lc);
		if(r>mid)s=max(s,q(mid+1,R,l,r,x->rc));
		return s;
	}
}
using namespace chairtree;
int main()
{
	freopen("longterm_segtree.in","r",stdin);
	freopen("longterm_segtree.out","w",stdout);
	cin>>n>>m;int l,r,k,z;null->lc=null->rc=null;
	for(int i=1;i<=n;i++)scanf("%d",&a[i]);
	build(1,n,root[1]);
	while(m--)
	{
		scanf("%d%d%d%d",&z,&k,&l,&r);
		if(z==1)
			root[++tot]=newtree(),insert(1,n,root[tot],root[k],l,r);
		else
			printf("%d\n",q(1,n,l,r,root[k]));
	}
}