记录编号 |
375616 |
评测结果 |
AAAAAAAAAAAAAAAAAAAA |
题目名称 |
数列操作C |
最终得分 |
100 |
用户昵称 |
liu_runda |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
1.368 s |
提交时间 |
2017-02-25 16:50:10 |
内存使用 |
6.39 MiB |
显示代码纯文本
#include<cstdio>
typedef long long ll;
const int maxn=100005;
ll sum[maxn<<2],mark[maxn<<2];
void build(int rt,int l,int r){
if(l==r){
scanf("%lld",&sum[rt]);return;
}
int mid=(l+r)>>1;
build(rt<<1,l,mid);build(rt<<1|1,mid+1,r);
sum[rt]=sum[rt<<1]+sum[rt<<1|1];
}
void pushdown(int rt,int l,int r){
if(mark[rt]){
mark[rt<<1]+=mark[rt];mark[rt<<1|1]+=mark[rt];
int mid=(l+r)>>1;
sum[rt<<1]+=mark[rt]*(mid-l+1);sum[rt<<1|1]+=mark[rt]*(r-mid);
mark[rt]=0;
}
}
void Add(int rt,int l,int r,const int &L,const int &R,const ll &x){
if(L<=l&&r<=R){
sum[rt]+=(r-l+1)*x;
mark[rt]+=x;
return;
}
pushdown(rt,l,r);
int mid=(l+r)>>1;
if(L<=mid)Add(rt<<1,l,mid,L,R,x);
if(R>mid)Add(rt<<1|1,mid+1,r,L,R,x);
sum[rt]=sum[rt<<1]+sum[rt<<1|1];
}
ll Query(int rt,int l,int r,const int &L,const int &R){
if(L<=l&&r<=R){
return sum[rt];
}
pushdown(rt,l,r);
int mid=(l+r)>>1;ll ans=0;
if(L<=mid)ans+=Query(rt<<1,l,mid,L,R);
if(R>mid)ans+=Query(rt<<1|1,mid+1,r,L,R);
return ans;
}
int main(){
freopen("shuliec.in","r",stdin);
freopen("shuliec.out","w",stdout);
int n;scanf("%d",&n);
build(1,1,n);
char buf[10];
int m;scanf("%d",&m);
int l,r;ll x;
while(m--){
scanf("%s",buf);
if(buf[0]=='A'){
scanf("%d%d%lld",&l,&r,&x);
Add(1,1,n,l,r,x);
}else{
scanf("%d%d",&l,&r);
printf("%lld\n",Query(1,1,n,l,r));
}
}
fclose(stdin);fclose(stdout);
return 0;
}