http://poj.org/problem?id=3468
http://acm.hdu.edu.cn/showproblem.php?pid=4267
C++版本一
/*
*@Author: STZG
*@Language: C++
*/
//#include <bits/stdc++.h>
#include<iostream>
#include<algorithm>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<string>
#include<vector>
#include<bitset>
#include<queue>
#include<deque>
#include<stack>
#include<cmath>
#include<list>
#include<map>
#include<set>
//#define DEBUG
#define RI register int
using namespace std;
typedef long long ll;
//typedef __int128 lll;
const int N=100000+10;
const int MOD=1e9+7;
const double PI = acos(-1.0);
const double EXP = 1E-8;
const int INF = 0x3f3f3f3f;
int t,n,m,k,q;
int ans,cnt,flag,temp;
int a[N];
char str[3];
ll lazy[N<<2];
ll tree[N<<2];
void pushup(int rt){
tree[rt]=tree[rt<<1]+tree[rt<<1|1];
}
void pushdown(int llen,int rlen,int rt){
tree[rt<<1]+=lazy[rt]*llen;
tree[rt<<1|1]+=lazy[rt]*rlen;
lazy[rt<<1]+=lazy[rt];
lazy[rt<<1|1]+=lazy[rt];
lazy[rt]=0;
}
void build(int l,int r,int rt){
if(l==r){
scanf("%lld",&tree[rt]);
return;
}
int mid=(l+r)>>1;
build(l,mid,rt<<1);
build(mid+1,r,rt<<1|1);
pushup(rt);
}
void updata(int l,int r,int rt,int L,int R,int C){
if(l>=L&&r<=R){
lazy[rt]+=C;
tree[rt]+=C*(r-l+1);
return;
}
int mid=(l+r)>>1;
pushdown(mid-l+1,r-mid,rt);
if(L<=mid)updata(l,mid,rt<<1,L,R,C);
if(R>mid)updata(mid+1,r,rt<<1|1,L,R,C);
pushup(rt);
}
ll query(int l,int r,int rt,int L,int R){
if(l>=L&&r<=R){
return tree[rt];
}
int mid=(l+r)>>1;
pushdown(mid-l+1,r-mid,rt);
ll res=0;
if(L<=mid)res+=query(l,mid,rt<<1,L,R);
if(R>mid)res+=query(mid+1,r,rt<<1|1,L,R);
return res;
}
int main()
{
#ifdef DEBUG
freopen("input.in", "r", stdin);
//freopen("output.out", "w", stdout);
#endif
scanf("%d%d",&n,&q);
//scanf("%d",&t);
//while(t--){}
build(1,n,1);
int l,r;
while(q--){
scanf("%s %d %d",str,&l,&r);
if(str[0]=='Q')
cout<<query(1,n,1,l,r)<<endl;
else{
scanf("%d",&t);
updata(1,n,1,l,r,t);
}
}
//cout << "Hello world!" << endl;
return 0;
}
C++版本二
#include <cstdio>
typedef long long LL;
const int maxn =1e5+5;
LL a[2][maxn];
LL psum[maxn];
int n;
inline int lowbit(int x)
{
return x&-x;
}
void add(LL a[],int x,int d)
{
while(x<=n)
{
a[x]+=d;
x+=lowbit(x);
}
}
LL sum(LL a[],int x)
{
LL ret=0;
while(x)
{
ret+=a[x];
x-=lowbit(x);
}
return ret;
}
LL query(int x)
{
return sum(a[1],x)*x+sum(a[0],x);
}
int main()
{
int q;
scanf("%d%d",&n,&q);
for(int i=1;i<=n;i++)
{
scanf("%I64d",&psum[i]);
psum[i]+=psum[i-1];
}
char op[3];
while(q--)
{
int l,r;
scanf("%s%d%d",op,&l,&r);
if(op[0]=='Q')
printf("%I64d\n",query(r)-query(l-1)+psum[r]-psum[l-1]);
else
{
int c;
scanf("%d",&c);
add(a[1],l,c);
add(a[1],r,-c);
add(a[0],l,c*(-l+1));
add(a[0],r,c*r);
}
}
}