中间乘法溢出了,好纠结(囧)..
#include<cstdio>
#include<cstdlib>
#include<cstring>
typedef long long ll;
int in[100000];
struct Tree{
int s;
int t;
ll sum;
int add;
}tree[270010];
void build(int s,int t,int id){
tree[id].s=s;
tree[id].t=t;
tree[id].add=0;
if(s==t)
tree[id].sum=in[s];
else{
int mid=(tree[id].s+tree[id].t)>>1;
build(s,mid,id*2);
build(mid+1,t,id*2+1);
tree[id].sum=tree[id*2].sum+tree[id*2+1].sum;
}
}
void insert(int s,int t,int id,int colour){
if(tree[id].s==s && tree[id].t==t){
tree[id].add+=colour;
tree[id].sum+=(ll)(tree[id].t-tree[id].s+1)*colour;
return ;
}
tree[id].sum+=(t-s+1)*colour;
if(tree[id].add!=0){
tree[id*2].add+=tree[id].add;
tree[id*2].sum+=(ll)(tree[id*2].t-tree[id*2].s+1)*tree[id].add; //
tree[id*2+1].add+=tree[id].add;
tree[id*2+1].sum+=(ll)(tree[id*2+1].t-tree[id*2+1].s+1)*tree[id].add; //
tree[id].add=0;
}
int mid=(tree[id].s+tree[id].t)>>1;
if(mid<s)
insert(s,t,id*2+1,colour);
else if(mid>=t)
insert(s,t,id*2,colour);
else{
insert(s,mid,id*2,colour);
insert(mid+1,t,id*2+1,colour);
}
}
ll query(int s,int t,int id){
if(tree[id].s==s && tree[id].t==t)
return tree[id].sum;
if(tree[id].add!=0){
tree[id*2].add+=tree[id].add;
tree[id*2].sum+=(ll)(tree[id*2].t-tree[id*2].s+1)*tree[id].add; //
tree[id*2+1].add+=tree[id].add;
tree[id*2+1].sum+=(ll)(tree[id*2+1].t-tree[id*2+1].s+1)*tree[id].add; //
tree[id].add=0;
}
int mid=(tree[id].s+tree[id].t)>>1;
if(mid<s)
return query(s,t,id*2+1);
else if(mid>=t)
return query(s,t,id*2);
else
return query(s,mid,id*2)+query(mid+1,t,id*2+1);
}
int main(){
int n,i,a,b,c,m,cc;
scanf("%d %d",&n,&m);
for(i=1;i<=n;i++)
scanf("%d",&in[i]);
build(1,n,1);
for(i=1;i<=m;i++){
char ss[5];
scanf("%s",ss);
if(ss[0]=='C'){
scanf("%d %d %d",&a,&b,&c);
insert(a,b,1,c);
}
else{
scanf("%d %d",&a,&b);
printf("%lld\n",query(a,b,1));
}
}
}