比赛 20110723 评测结果 AAWWWWWW
题目名称 儿童节快乐 最终得分 25
用户昵称 苏轼 运行时间 0.000 s
代码语言 C++ 内存使用 0.00 MiB
提交时间 2011-07-23 08:55:29
显示代码纯文本
#include <cstdio>
#include <vector>
using namespace std;

typedef pair<int,int> Pair;
#define mp make_pair
const int MAXN=100005;

struct Node
{
	int l,r,mid;
	int add,val,pos;
	Node *c[2];
	Node (int _l,int _r):l(_l),r(_r){mid=(l+r)/2;pos=l;}
	Node (){}
	void down()
	{
		if (l!=r && add!=0)
		{
			c[0]->add+=add;
			c[0]->val+=add;
			c[1]->add+=add;
			c[1]->val+=add;
		}
		add=0;
	}
	void update()
	{
		if (l!=r)
		{
			if (c[0]->val>=c[1]->val)
				val=c[0]->val,pos=c[0]->pos;
			else
				val=c[1]->val,pos=c[1]->pos;
		}
	}
	void *operator new (size_t,void *p){return p;}
}pool[MAXN*2],*mem=pool;

struct SegmentTree
{
	Node *root;
	void build(Node *&v,int l,int r)
	{
		v=new (mem++)Node(l,r);
		if (l==r)
			return ;
		build(v->c[0],l,v->mid);
		build(v->c[1],v->mid+1,r);
	}
	void add(Node *v,int l,int r,int val)
	{
		v->down();
		if (v->l==l && v->r==r)
		{
			v->val+=val;
			v->add+=val;
			return ;
		}
		if (r<=v->mid)
			add(v->c[0],l,r,val);
		else if (l>v->mid)
			add(v->c[1],l,r,val);
		else
		{
			add(v->c[0],l,v->mid,val);
			add(v->c[1],v->mid+1,r,val);
		}
		v->update();
	}
	Pair query(Node *v,int l,int r)
	{
		v->down();
		if (v->l==l && v->r==r)
			return mp(v->val,v->pos);
		if (r<=v->mid)
			return query(v->c[0],l,r);
		else if (l>v->mid)
			return query(v->c[1],l,r);
		else
		{
			Pair ans1=query(v->c[0],l,v->mid);
			Pair ans2=query(v->c[1],v->mid+1,r);
			if (ans1.first>=ans2.first)
				return ans1;
			else
				return ans2;
		}
	}
	void build(int N)
	{
		build(root,1,N);
	}
	void add(int l,int r,int val)
	{
		add(root,l,r,val);
	}
	int query(int l,int r)
	{
		Pair ans=query(root,l,r);
		add(ans.second,ans.second,-ans.first);
		return ans.first;
	}
}tree;

int main()
{
	freopen("happya.in","r",stdin);
	freopen("happya.out","w",stdout);
	int N,M;
	scanf("%d%d",&N,&M);
	tree.build(N);
	for(int i=0;i<M;i++)
	{
		char ch;
		int a,b,c;
		scanf(" %c",&ch);
		if (ch=='I')
		{
			scanf("%d%d%d",&a,&b,&c);
			tree.add(a,b,c);
		}
		else
		{
			scanf("%d%d",&a,&b);
			printf("%d\n",tree.query(a,b));
		}
	}
	return 0;
}