记录编号 |
558327 |
评测结果 |
AAAAAAAAAAAAAAAAAAAA |
题目名称 |
数列操作C |
最终得分 |
100 |
用户昵称 |
乐未殇 |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
7.481 s |
提交时间 |
2020-12-22 10:17:50 |
内存使用 |
12.82 MiB |
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<cmath>
#include<iomanip>
#include<algorithm>
#include<string>
#define ll long long
#define maxx 100010
using namespace std;
struct tree{
int z,r;
ll sum,lz;
}tr[maxx*4];
int a[maxx],n,m;
void build(int rt,int z,int r){
tr[rt].z=z;
tr[rt].r=r;
if(z==r){
tr[rt].sum=a[z];
return ;
}
int mid=(z+r)/2;
build(rt*2,z,mid);
build(rt*2+1,mid+1,r);
tr[rt].sum=tr[rt*2].sum+tr[rt*2+1].sum;
}
void xc(int rt){
if(tr[rt].lz){
tr[rt*2].sum+=tr[rt].lz*(tr[rt*2].r-tr[rt*2].z+1);
tr[rt*2+1].sum+=tr[rt].lz*(tr[rt*2+1].r-tr[rt*2+1].z+1);
tr[rt*2].lz+=tr[rt].lz;
tr[rt*2+1].lz+=tr[rt].lz;
tr[rt].lz=0;
}
return ;
}
void change(int p,int l,int r,int d){
if(l<=tr[p].z&&r>=tr[p].r){
tr[p].sum+=(long long)d*(tr[p].r-tr[p].z+1);
tr[p].lz+=d;
return ;
}
xc(p);
int mid=(tr[p].z+tr[p].r)/2;
if(l<=mid)change(p*2,l,r,d);
if(r>mid)change(p*2+1,l,r,d);
tr[p].sum=tr[p*2].sum+tr[p*2+1].sum;
}
ll ask(int rt,int z,int r){
if(z<=tr[rt].z&&tr[rt].r<=r) return tr[rt].sum;
xc(rt);
int mid=(tr[rt].z+tr[rt].r)/2;
ll val=0;
if(z<=mid)val+=ask(rt*2,z,r);
if(r>mid)val+=ask(rt*2+1,z,r);
return val;
}
int main(){
freopen("shuliec.in","r",stdin);
freopen("shuliec.out","w",stdout);
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
}
build(1,1,n);
cin>>m;
for(int i=1;i<=m;i++){
char op[3];
int l,r,d;
cin>>op>>l>>r;
if(op[0]=='A'){
cin>>d;
change(1,l,r,d);
}
else{
cout<<ask(1,l,r);
}
}
return 0;
}