代码:
#include<cstdio>
using namespace std;
const int maxn=250001;
const long long inf=0x3f3f3f3f3f3f3f3f;
long long a[maxn<<2],s[maxn<<2],d[maxn<<2],c[maxn<<2];
bool is_reset[maxn<<2];
inline void PushUp(int rt)
{
s[rt]=s[rt<<1]+s[rt<<1|1];
}
inline void PushDown(int rt,int ln,int rn)
{
if(is_reset[rt])
{
is_reset[rt]=false;
c[rt<<1]=c[rt<<1|1]=c[rt];
a[rt<<1]=a[rt<<1|1]=d[rt<<1]=d[rt<<1|1]=0;
s[rt<<1]=c[rt]*ln;
s[rt<<1|1]=c[rt]*rn;
is_reset[rt<<1]=is_reset[rt<<1|1]=true;
}
if(a[rt]||d[rt])
{
a[rt<<1]+=a[rt];
a[rt<<1|1]+=a[rt]+d[rt]*ln;
d[rt<<1]+=d[rt];
d[rt<<1|1]+=d[rt];
s[rt<<1]+=a[rt]*ln+ln*(long long)(ln-1)/2*d[rt];
s[rt<<1|1]+=(a[rt]+d[rt]*ln)*rn+rn*(long long)(rn-1)/2*d[rt];
a[rt]=d[rt]=0;
}
}
void Update(int L,int R,long long C,int l,int r,int rt)
{
if(L<=l&&r<=R)
{
if(C==inf)
{
a[rt]+=l-L+1;
++d[rt];
s[rt]+=(l-L+1)*(long long)(r-l+1)+(r-l+1)*(long long)(r-l)/2;
}
else if(C==(inf<<1))
{
a[rt]+=R-l+1;
--d[rt];
s[rt]+=(R-l+1)*(long long)(r-l+1)-(r-l+1)*(long long)(r-l)/2;
}
else
{
is_reset[rt]=true;
a[rt]=d[rt]=0;
c[rt]=C;
s[rt]=(r-l+1)*C;
}
return;
}
int mid=(l+r)>>1;
PushDown(rt,mid-l+1,r-mid);
if(L<=mid)
{
Update(L,R,C,l,mid,rt<<1);
}
if(R>mid)
{
Update(L,R,C,mid+1,r,rt<<1|1);
}
PushUp(rt);
}
long long Query(int L,int R,int l,int r,int rt)
{
if(L<=l&&r<=R)
{
return s[rt];
}
int mid=(l+r)>>1;
PushDown(rt,mid-l+1,r-mid);
long long ans=0;
if(L<=mid)
{
ans+=Query(L,R,l,mid,rt<<1);
}
if(R>mid)
{
ans+=Query(L,R,mid+1,r,rt<<1|1);
}
return ans;
}
char op[2];
const int n=250000;
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
int l,r;
scanf("%s%d%d",op,&l,&r);
if(op[0]=='A')
{
Update(l,r,inf,1,n,1);
}
else if(op[0]=='B')
{
Update(l,r,inf<<1,1,n,1);
}
else if(op[0]=='C')
{
long long x;
scanf("%lld",&x);
Update(l,r,x,1,n,1);
}
else
{
printf("%lld\n",Query(l,r,1,n,1));
}
}
return 0;
}
蔡弈文
全部评论