比赛 |
cdcqの省选膜你赛 |
评测结果 |
AAAAAAAAAAAAAAAAEEEE |
题目名称 |
新史「新幻想史 -现代史-」 |
最终得分 |
80 |
用户昵称 |
scpointer |
运行时间 |
3.656 s |
代码语言 |
C++ |
内存使用 |
184.54 MiB |
提交时间 |
2017-04-11 21:56:37 |
显示代码纯文本
#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 100050
#define NDS 8000050
#define LIM 100000
#define lowbit(x) ((x)&(-x))
int rot[N];
int ls[NDS],rs[NDS],ndcnt;
ll sum[NDS],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 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]);
}
}
}