题目链接:http://poj.org/problem?id=3468
裸区间更新。值得注意,大数据暴int.
代码如下
#include <iostream>
#include <iomanip>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <queue>
#include <vector>
#include <stack>
#include <string>
#include <cstring>
using namespace std;
typedef long long ll;
const int maxn=111111;
const int INF=0x7fffffff;
const int mod=1e7+7;
#define LSON l,m,rt<<1
#define RSON m+1,r,rt<<1|1
#define ESP 1e-7
ll sum[maxn<<2],lazy[maxn<<2];
void push_up(int rt) {
sum[rt]=sum[rt<<1]+sum[rt<<1|1];
}
void push_down(int rt, int len) {
if(lazy[rt]) {
lazy[rt<<1]+=lazy[rt];
lazy[rt<<1|1]+=lazy[rt];
sum[rt<<1]+=lazy[rt]*(len-(len>>1));
sum[rt<<1|1]+=lazy[rt]*(len>>1);
lazy[rt]=0;
}
}
void build(int l, int r, int rt) {
lazy[rt]=0;
if(l==r) {
cin >> sum[rt];
return ;
}
int m=(l+r)>>1;
build(LSON);
build(RSON);
push_up(rt);
}
void update(int L, int R, int c, int l, int r, int rt) {
if(L<=l && r<=R) {
lazy[rt]+=c;
sum[rt]+=1LL*c*(r-l+1);
return ;
}
push_down(rt, r-l+1);
int m=(l+r)>>1;
if(L<=m) update(L, R, c, LSON);
if(R>m) update(L, R, c, RSON);
push_up(rt);
}
ll query(int L, int R, int l, int r, int rt) {
ll tmp=0;
if(L<=l && r<=R) return sum[rt];
push_down(rt, r-l+1);
int m=(l+r)>>1;
if(L<=m) tmp+=query(L, R, LSON);
if(R>m) tmp+=query(L, R, RSON);
return tmp;
}
int main() {
int n,q;
while(scanf("%d%d", &n, &q)!=EOF) {
build(1, n, 1);
while(q--) {
int x,y,z;
char odd[3];
scanf("%s%d%d", odd, &x, &y);
if(odd[0]=='C')
scanf("%d", &z);
if(odd[0]=='Q')
printf("%lld\n", query(x, y, 1, n, 1));
else
update(x, y, z, 1, n, 1);
}
}
return 0;
}