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