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