#include<cstdio>
#include<cstring>
#include<iostream>
#include<cmath>
#include<algorithm>
using namespace std;
#define lc l,m,index<<1
#define rc m+1,r,index<<1|1
#define inf 0x7f7f7f7f
#define N 100005
struct node
{
int e;//获得经验标记
int maxexp;//最大经验数
int mine;//区间有人要升级需要的最小的e
}seg[N<<2];
int Need[15];
int n,k,q;
int getlevel(int exp)//计算等级
{
int i;
for(i=k;;i--)if(exp>=Need[i])return i;
}
void fexp(int e,int l,int r,int index)//获得经验
{
int level=getlevel(seg[index].maxexp);
seg[index].e+=e;
seg[index].maxexp+=e*level;
seg[index].mine-=e;
}
void pushup(int l,int r,int index)
{
node& father=seg[index];
node& lson=seg[index<<1];
node& rson=seg[index<<1|1];
father.maxexp=max(lson.maxexp,rson.maxexp);
father.mine=min(lson.mine,rson.mine);
}
void pushdown(int l,int r,int index)
{
int m=(l+r)>>1;
node& father=seg[index];
node& lson=seg[index<<1];
node& rson=seg[index<<1|1];
if(father.e)
{
fexp(father.e,lc);
fexp(father.e,rc);
father.e=0;
}
}
void build(int l,int r,int index)
{
int m=(l+r)>>1;
seg[index].e=seg[index].maxexp=0;
seg[index].mine=Need[2];
if(l==r)return;
build(lc);
build(rc);
}
void updata(int L,int R,int e,int l,int r,int index)
{
int m=(l+r)>>1,level;
if(L==l&&R==r)
{
fexp(e,l,r,index);//得经验
if(l==r)
{
level=getlevel(seg[index].maxexp);//当前等级
if((Need[level+1]-seg[index].maxexp)%level==0)//计算mine
seg[index].mine=(Need[level+1]-seg[index].maxexp)/level;
else seg[index].mine=((Need[level+1]-seg[index].maxexp)/level)+1;
return;
}
else if(seg[index].e<seg[index].mine)return;
else
{
updata(l,m,seg[index].e,lc);
updata(m+1,r,seg[index].e,rc);
pushup(l,r,index);
seg[index].e=0;
return;
}
}
pushdown(l,r,index);
if(R<=m)updata(L,R,e,lc);
else if(L>m)updata(L,R,e,rc);
else
{
updata(L,m,e,lc);
updata(m+1,R,e,rc);
}
pushup(l,r,index);
}
int query(int L,int R,int l,int r,int index)
{
int m=(l+r)>>1;
if(L==l&&R==r)return seg[index].maxexp;
pushdown(l,r,index);
if(R<=m)return query(L,R,lc);
else if(L>m)return query(L,R,rc);
else
{
return max(query(L,m,lc),query(m+1,R,rc));
}
}
int main()
{
int t,tcase=1,num,i,a,b,e;
char op[15];
scanf("%d",&t);
while(t--)
{
printf("Case %d:\n",tcase++);
scanf("%d%d%d",&n,&k,&q);
Need[1]=0;
for(i=2;i<=k;i++)
{
scanf("%d",&Need[i]);
}
Need[k+1]=inf;
build(1,n,1);
while(q--)
{
scanf("%s%d%d",op,&a,&b);
if(op[0]=='W')
{
scanf("%d",&e);
updata(a,b,e,1,n,1);
}
else
{
printf("%d\n",query(a,b,1,n,1));
}
}
printf("\n");
}
return 0;
}
hdu 3954(比较特别的成端更新)
最新推荐文章于 2019-07-16 21:07:00 发布