记录编号 469890 评测结果 AAAAAAAAAA
题目名称 可持久化线段树 最终得分 100
用户昵称 GravatarFisher. 是否通过 通过
代码语言 C++ 运行时间 0.213 s
提交时间 2017-11-03 21:30:25 内存使用 15.58 MiB
显示代码纯文本
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
inline int read(){
	int x=0,f=1;char c=getchar();
	while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
	while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}
	return x*f;
}
const int maxn=10010;
int n,m;
int gen[1000010],sz;
int maxx[maxn*100],ls[maxn*100],rs[maxn*100];
inline void change(int shang,int &xin,int l,int r,int nl,int nr,int v){
	xin=++sz;
	if(l>=nl&&r<=nr){
		maxx[xin]=v;
		return ;
	}
	int m=(l+r)>>1;
	ls[xin]=ls[shang];
	rs[xin]=rs[shang];
	if(m>=nl)change(ls[shang],ls[xin],l,m,nl,nr,v);
	if(m<nr)change(rs[shang],rs[xin],m+1,r,nl,nr,v);
	maxx[xin]=max(maxx[ls[xin]],maxx[rs[xin]]);
}
inline int find(int xin,int l,int r,int nl,int nr){
	if(l>=nl&&r<=nr){return maxx[xin];}
	int ans=-0x7fffffff;
	int m=(l+r)>>1;
	if(m>=nl)ans=max(ans,find(ls[xin],l,m,nl,nr));
	if(m<nr)ans=max(ans,find(rs[xin],m+1,r,nl,nr));
	return ans;
}
int main(){
	freopen("longterm_segtree.in","r",stdin);
	freopen("longterm_segtree.out","w",stdout);
	n=read();m=read();
	int k=1;
	for(int i=1;i<=n;i++){
		int x=read();
		change(gen[k],gen[k],1,n,i,i,x);
	}
	for(int i=1;i<=m;i++){
		int c=read(),ban=read(),x=read(),y=read();
		if(c==0){
			printf("%d\n",find(gen[ban],1,n,x,y));
		} 
		if(c==1){
			change(gen[ban],gen[++k],1,n,x,x,y);
		}
	}
	return 0;
}