记录编号 155656 评测结果 AAAAAAAAAA
题目名称 区间权最大 最终得分 100
用户昵称 Gravatarnew ioer 是否通过 通过
代码语言 C++ 运行时间 1.612 s
提交时间 2015-03-29 18:46:03 内存使用 7.92 MiB
显示代码纯文本
#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn=200010;
struct ask{
	int l,r,x,id;
}q[maxn];
struct node{
	node *c[2];
	int v,siz,maxm;
	node *init();
	void mata(){
		siz=c[0]->siz+c[1]->siz+1;
		maxm=max(v,max(c[0]->maxm,c[1]->maxm));
	}
	int cmp(int k){
		if(k<=c[0]->siz) return 0;
		if(k==c[0]->siz+1) return -1;
		return 1;
	}
}Null,spt[maxn],*root;
node *node::init(){
	v=maxm=0,siz=1,c[0]=c[1]=&Null;
	return this;
}
int n,m,tot,cnt,maxr,ans[maxn];
bool cmp(ask a,ask b){
	if(a.r!=b.r) return a.r<b.r;
	return a.id<b.id;
}
node *build(int l,int r){
	if(l==r) return spt[++cnt].init();
	int mid=(l+r)>>1;
	node *tmp=spt[++cnt].init();
	if(l<mid) tmp->c[0]=build(l,mid-1);
	if(r>mid) tmp->c[1]=build(mid+1,r);
	tmp->mata();
	return tmp;
}
void rot(node *&o,bool k){
	node *tmp=o->c[k];
	o->c[k]=tmp->c[!k];
	tmp->c[!k]=o;
	o->mata(),tmp->mata(),o=tmp;
}
void splay(node *&o,int k){
	int k1=o->cmp(k);
	if(k1==-1) return;
	if(k1) k-=o->c[0]->siz+1;
	int k2=o->c[k1]->cmp(k);
	if(~k2){
		if(k2) k-=o->c[k1]->c[0]->siz+1;
		splay(o->c[k1]->c[k2],k);
		if(k1==k2) rot(o,k1);
		else rot(o->c[k1],k2);
	} 
	rot(o,k1);
}
int query(int l,int r){
	l++,r++;
	int len=r-l+1;
	splay(root,l-1),splay(root->c[1],len+1);
	return root->c[1]->c[0]->maxm;
}
void change(int i,int x){
	splay(root,++i);
	root->v=max(root->v,x);
	root->maxm=max(root->maxm,root->v);
}
int main(){
	freopen("max.in","r",stdin);
	freopen("max.out","w",stdout);
	scanf("%d%d",&n,&m),tot=m+n;
	for(int i=1;i<=n;i++) scanf("%d%d%d",&q[i].l,&q[i].r,&q[i].x),maxr=max(maxr,q[i].r);
	for(int i=1,j=n+1;i<=m;i++,j++) scanf("%d%d",&q[j].l,&q[j].r),maxr=max(maxr,q[j].r),q[j].id=i;
	root=build(0,maxr+1);
	sort(q+1,q+tot+1,cmp);
	for(int i=1;i<=tot;i++){
		if(q[i].id) ans[q[i].id]=query(q[i].l,q[i].r);
		else change(q[i].l,q[i].x);
	}
	for(int i=1;i<=m;i++) printf("%d\n",ans[i]);
}