比赛 20110723 评测结果 AAWWWWWW
题目名称 儿童节快乐 最终得分 25
用户昵称 .Xmz 运行时间 0.000 s
代码语言 C++ 内存使用 0.00 MiB
提交时间 2011-07-23 11:11:27
显示代码纯文本
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <cmath>
#include <set>
using namespace std;
int n,m;

struct node
{
	node *l,*r;
	int delta,a,b,maxv,id;
}P[222222],*root;
int pn;

void build(node *&p,int a,int b)
{
	p=&P[++pn];
	p->a=a;p->b=b;p->delta=p->maxv=0;
	p->id=p->a;
	if (a==b) return;
	build(p->l,a,(a+b)/2);
	build(p->r,(a+b)/2+1,b);
}

void paint(node *p,int delta)
{
	p->maxv+=delta;
	if (p->a!=p->b) p->delta+=delta;
}

void push(node *p)
{
	if (p->delta && p->a!=p->b)
	{
		paint(p->l,p->delta);
		paint(p->r,p->delta);
		p->delta=0;
	}
}

void update(node *p)
{
	push(p);
	if (p->a!=p->b)
	{
		if (p->l->maxv>=p->r->maxv) p->maxv=p->l->maxv,p->id=p->l->id;
		else p->maxv=p->r->maxv,p->id=p->r->id;
	}
}

void add(node *p,int a,int b,int c)
{
	push(p);
	if (p->b<a || b<p->a) return;
	if (a<=p->a && p->b<=b) paint(p,c);
	else
	{
		add(p->l,a,b,c);
		add(p->r,a,b,c);
	}
	update(p);
}

void check(node *p,int a,int b,int &id,int &maxv)
{
	push(p);
	if (p->b<a || b<p->a) return ;
	if (a<=p->a && p->b<=b)
	{
		if (p->maxv>maxv || (p->maxv==maxv && p->id<id)) maxv=p->maxv,id=p->id;
	}
	else
	{
		check(p->l,a,b,id,maxv);
		check(p->r,a,b,id,maxv);
	}
	update(p);
}

void modify(node *p,int id)
{
	push(p);
	if (p->a==p->b) p->maxv=0;
	else
	{
		if (id<=p->l->b) modify(p->l,id);
		else modify(p->r,id);
	}
	update(p);
}

void init()
{
	scanf("%d%d",&n,&m);
	build(root,1,n);
}

void solve()
{
	char st[5];
	int a,b,c;
	for (;m;--m)
	{
		scanf("%s",st);
		if (st[0]=='C')
		{
			scanf("%d%d",&a,&b);
			int id=1,maxv=-1;
			check(root,a,b,id,maxv);
			printf("%d\n",maxv);
			modify(root,id);
		}
		else
		{
			scanf("%d%d%d",&a,&b,&c);
			add(root,a,b,c);
		}
	}
}

int main()
{
	freopen("happya.in","r",stdin);
	freopen("happya.out","w",stdout);
	init();
	solve();
	return 0;
}