记录编号 |
444463 |
评测结果 |
AAAAAAAAAA |
题目名称 |
数列操作C |
最终得分 |
100 |
用户昵称 |
TARDIS |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
0.246 s |
提交时间 |
2017-09-03 08:57:12 |
内存使用 |
9.85 MiB |
显示代码纯文本
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<iostream>
#include<cstring>
using namespace std;
const int maxn=1e5+10;
struct node{
long long sum,add;
int l,r;
}seg[4*maxn];
int n,m,k,ans,val[maxn];
void build(int l,int r,int o){
seg[o].l=l,seg[o].r=r;
if (l==r){
seg[o].sum=val[l];
return;
}
int mid=(l+r)>>1;
build(l,mid,o<<1);
build(mid+1,r,o<<1|1);
seg[o].sum=seg[o<<1].sum+seg[o<<1|1].sum;
}
void add(int L,int R,int o,int x){
int l=seg[o].l,r=seg[o].r;
if (l>=L&&R>=r){
seg[o].sum+=(long long)(r-l+1)*x;
seg[o].add+=x;
return;
}
int len=(r-l+1);
if (seg[o].add){
seg[o<<1].add+=seg[o].add;
seg[o<<1|1].add+=seg[o].add;
seg[o<<1].sum+=(long long)seg[o].add*(len-(len>>1));
seg[o<<1|1].sum+=(long long)seg[o].add*(len>>1);
seg[o].add=0;
}
int mid=(l+r)>>1;
if (L<=mid) add(L,R,o<<1,x);
if (R>mid) add(L,R,o<<1|1,x);
seg[o].sum=seg[o<<1].sum+seg[o<<1|1].sum;
return;
}
long long query(int L,int R,int o){
int l=seg[o].l,r=seg[o].r;
if (L<=l&&r<=R){
return seg[o].sum;
}
int len=r-l+1;
if (seg[o].add){
seg[o<<1].add+=seg[o].add;
seg[o<<1|1].add+=seg[o].add;
seg[o<<1].sum+=(long long)seg[o].add*(len-(len>>1));
seg[o<<1|1].sum+=(long long)seg[o].add*(len>>1);
seg[o].add=0;
}
int mid=(l+r)>>1;
long long ans=0;
if (L<=mid) ans+=query(L,R,o<<1);
if (R>mid) ans+=query(L,R,o<<1|1);
return ans;
}
int main(){
freopen("shuliec.in","r",stdin);
freopen("shuliec.out","w",stdout);
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d",&val[i]);
}
build(1,n,1);
scanf("%d",&m);
while (m--){
char type[8];
scanf("%s",type);
if (type[0]=='A'){
int L,R,k;
scanf("%d%d%d",&L,&R,&k);
add(L,R,1,k);
}
if (type[0]=='S'){
int L,R;
scanf("%d%d",&L,&R);
printf("%lld\n",query(L,R,1));
}
}
}