记录编号 |
393880 |
评测结果 |
AAAAAAAAAAAAAAAATTTT |
题目名称 |
新史「新幻想史 -现代史-」 |
最终得分 |
80 |
用户昵称 |
scpointer |
是否通过 |
未通过 |
代码语言 |
C++ |
运行时间 |
8.965 s |
提交时间 |
2017-04-12 12:10:28 |
内存使用 |
215.36 MiB |
显示代码纯文本
#include <cstdio>
typedef long long ll;
inline int RD()
{
int res;char cr;
while( (cr=getchar())<'0' || cr>'9'); res=cr-'0';
while( (cr=getchar())>='0' && cr<='9') res=res*10+cr-'0';
return res;
}
inline char RC()
{
char cr;
while( (cr=getchar())<'A' || cr>'Z');
return cr;
}
#define N 50050
#define NDS 12500050
#define LIM 50000
#define lowbit(x) ((x)&(-x))
int rot[N];
int ls[NDS],rs[NDS],ndcnt;
ll sum[NDS];
int prev[NDS];
void pushdown(int rt,int l,int r)
{
if(prev[rt])
{
if(!ls[rt]) ls[rt]=++ndcnt;
if(!rs[rt]) rs[rt]=++ndcnt;
int mid=(l+r)>>1;
prev[ls[rt]]+=prev[rt];
prev[rs[rt]]+=prev[rt];
sum[ls[rt]]+=prev[rt]*(mid-l+1);
sum[rs[rt]]+=prev[rt]*(r-mid);
prev[rt]=0;
}
}
void update(int rt){sum[rt]=sum[ls[rt]]+sum[rs[rt]];}
void add(int &rt,int gl,int gr,ll gv,int l=1,int r=LIM)
{
if(!rt) rt=++ndcnt;
else pushdown(rt,l,r);
if(gl==l && gr==r)
{
prev[rt]+=gv;
sum[rt]+=gv*(r-l+1);
return;
}
int mid=(l+r)>>1;
if(gr<=mid) add(ls[rt],gl,gr,gv,l,mid);
else if(gl>mid) add(rs[rt],gl,gr,gv,mid+1,r);
else add(ls[rt],gl,mid,gv,l,mid),add(rs[rt],mid+1,gr,gv,mid+1,r);
update(rt);
}
ll getsum(int &rt,int gl,int gr,int l=1,int r=LIM)
{
if(!rt) return 0;
else if(!ls[rt] && !rs[rt]) return sum[rt]/(r-l+1)*(gr-gl+1);
else pushdown(rt,l,r);
if(gl==l && gr==r)
return sum[rt];
int mid=(l+r)>>1;
if(gr<=mid) return getsum(ls[rt],gl,gr,l,mid);
else if(gl>mid) return getsum(rs[rt],gl,gr,mid+1,r);
else return getsum(ls[rt],gl,mid,l,mid)+getsum(rs[rt],mid+1,gr,mid+1,r);
}
ll ai[N];
int main()
{
freopen("cdcq_a.in","r",stdin);
freopen("cdcq_a.out","w",stdout);
int n,Q;n=RD();Q=RD();
for(int i=1;i<=n;i++)
ai[i]=ai[i-1]+RD();
while(Q--)
{
if(RC()=='M')
{
int l1,r1,v1,l2,r2,v2,tim;
l1=RD();r1=RD();v1=RD();l2=RD();r2=RD();v2=RD();tim=RD();
for(;tim<=LIM;tim+=lowbit(tim))
add(rot[tim],l1,r1,-v1),add(rot[tim],l2,r2,v2);
}
else
{
int l,r,tim;ll ans=0;
l=RD();r=RD();tim=RD();
for(;tim;tim-=lowbit(tim))
ans+=getsum(rot[tim],l,r);
printf("%lld\n",ans+ai[r]-ai[l-1]);
}
}
}