比赛 20110723 评测结果 AAWWWWWW
题目名称 儿童节快乐 最终得分 25
用户昵称 PurpleShadow 运行时间 0.000 s
代码语言 C++ 内存使用 0.00 MiB
提交时间 2011-07-23 09:05:42
显示代码纯文本
#include<cstdio> 
#include <algorithm>
using namespace std;
const int N=100010;
int n,m;
struct node
{
	int m,p,c;
	int l,r;
	node(const int &t=0):m(t),p(N){}
	bool operator<(const node& t)const
	{return m<t.m||m==t.m&&p>t.p;}
}tr[4*N];
inline void push_down(const int &p)
{
	if (!tr[p].c) return;
	if (tr[p].l!=tr[p].r)
	{
		tr[p<<1].c+=tr[p].c;
		tr[p<<1|1].c+=tr[p].c;
	}
	tr[p].m+=tr[p].c;
	tr[p].c=0;
}
inline void update(const int &p)
{
	push_down(p<<1);push_down(p<<1|1);
	if (tr[p<<1].m>=tr[p<<1|1].m) 
	{
		tr[p].m=tr[p<<1].m;
		tr[p].p=tr[p<<1].p;
	}
	else
	{
		tr[p].m=tr[p<<1|1].m;
		tr[p].p=tr[p<<1|1].p;
	}
}
void build(int l,int r,int p)
{
	tr[p].l=l;tr[p].r=r;
	tr[p].c=0;
	if (l==r)
	{
		tr[p].p=l;
		tr[p].m=0;
		return;
	}
	int mid=(l+r)>>1;
	build(l,mid,p<<1);
	build(mid+1,r,p<<1|1);
	update(p);
}
void init()
{
	scanf("%d%d\n",&n,&m);
	build(1,n,1);
}
void Add(int a,int b,int c,int p)
{
	push_down(p);
	if (a<=tr[p].l&&b>=tr[p].r)
	{
		tr[p].c+=c;
		return;
	}
	int mid=(tr[p].l+tr[p].r)>>1;
	if (a<=mid) Add(a,b,c,p<<1);
	if (b>mid) Add(a,b,c,p<<1|1);
	update(p);
}
node query(int a,int b,int p)
{
	push_down(p);
	if (a<=tr[p].l&&b>=tr[p].r) return tr[p];
	int mid=(tr[p].l+tr[p].r)>>1;
	node ans;
	if (a<=mid) ans=max(ans,query(a,b,p<<1));
	if (b>mid) ans=max(ans,query(a,b,p<<1|1));
	return ans;
}
void Change(int x,int p)
{
	push_down(p);
	if (tr[p].l==tr[p].r)
	{
		tr[p].m=0;
		return;
	}
	int mid=(tr[p].l+tr[p].r)>>1;
	if (x<=mid) Change(x,p<<1);else Change(x,p<<1|1);
	update(p);
}
void slove()
{
	char task;
	int a,b,c;
	while (m--)
	{
		scanf("%c",&task);
		if (task=='I') 
		{
			scanf("%d%d%d",&a,&b,&c);
			Add(a,b,c,1);
		}
		else
		{
			scanf("%d%d",&a,&b);
			node tmp=query(a,b,1);
			Change(tmp.p,1);
			printf("%d\n",tmp.m);
		}
		scanf("\n");
	}
}
int main()
{
freopen("happya.in","r",stdin);
freopen("happya.out","w",stdout);
	init();
	slove();
	return 0;
}