比赛 |
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;
}