注:本系列只为整理、保存比赛模板用,并非代码均为自己所写。会给出原代码的链接。
题号:POJ3468
题意:模板题不解释。。
#include<iostream>
#include<cstring>
#include<cstdio>
#define ll long long
using namespace std;
int a[100010];
ll sum[100010<<2];
ll lazy[100010<<2];
void pushdown(int rt,int ln,int rn){
if(lazy[rt]){
lazy[rt<<1]+=lazy[rt];
lazy[(rt<<1)+1]+=lazy[rt];
sum[rt<<1]+=lazy[rt]*ln;
sum[(rt<<1)+1]+=lazy[rt]*rn;
lazy[rt]=0;
}
}
ll build(int l,int r,int rt){
if(l==r){
return sum[rt]=a[l];
}
int mid=(l+r)/2;
return sum[rt]=build(l,mid,rt<<1)+build(mid+1,r,(rt<<1)+1);
}
void update(int l,int r,int rt,int a,int b,int c){
if(a<=l&&r<=b){
sum[rt]+=c*(r-l+1);
lazy[rt]+=c;
return ;
}
int mid=(l+r)/2;
pushdown(rt,mid-l+1,r-mid);
if(a<=mid)update(l,mid,rt<<1,a,b,c);
if(b>mid)update(mid+1,r,(rt<<1)+1,a,b,c);
sum[rt]=sum[rt<<1]+sum[(rt<<1)+1];
return ;
}
ll query(int l,int r,int rt,int a,int b){
if(a<=l&&r<=b){
return sum[rt];
}
int mid=(l+r)/2;
ll ans=0;
pushdown(rt,mid-l+1,r-mid);
if(a<=mid)ans+=query(l,mid,rt<<1,a,b);
if(b>mid)ans+=query(mid+1,r,(rt<<1)+1,a,b);
return ans;
}
int main(){
int n,q;
cin>>n>>q;
memset(a,0,sizeof(a));
memset(sum,0,sizeof(sum));
memset(lazy,0,sizeof(lazy));
for(int i=1;i<=n;i++)scanf("%d",&a[i]);
build(1,n,1);
//for(int i=0;i<(n<<2);i++)cout<<sum[i]<<endl;
while(q--){
char s[2];
scanf("%s",s);
if(s[0]=='C'){
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
update(1,n,1,a,b,c);
}
else{
int a,b;
scanf("%d%d",&a,&b);
printf("%lld\n",query(1,n,1,a,b));
}
}
}
/*
10 5
1 2 3 4 5 6 7 8 9 10
Q 4 4
Q 1 10
Q 2 4
C 3 6 3
Q 2 4
5 100
1 2 3 4 5
Q 1 1
Q 2 4
*/