同上。。。
#include <cstdio> #include <cstring> #include <algorithm> #include <climits> #include <string> #include <iostream> #include <map> #include <cstdlib> #include <list> #include <set> #include <queue> #include <stack> #include<math.h> using namespace std; typedef long long LL; #define lson l,mid,rt<<1 #define rson mid+1,r,rt<<1|1 LL sum[444444]; LL color[444444]; void up(LL rt) { sum[rt] = sum[rt << 1] + sum[rt << 1 | 1]; } void down(LL rt, LL len) { if (color[rt]){ color[rt << 1] += color[rt]; color[rt << 1 | 1] += color[rt]; LL mid = len >> 1; sum[rt << 1] += color[rt] * (len - mid); sum[rt << 1 | 1] += color[rt] * mid; color[rt] = 0; } } void build(LL l, LL r, LL rt) { color[rt] = 0; if (l == r){ scanf("%I64d", &sum[rt]); return; } LL mid = (l + r) >> 1; build(lson); build(rson); up(rt); } void update(LL L, LL R, LL ad, LL l, LL r, LL rt) { if (L <= l&&r <= R){ sum[rt] += ad*(r - l + 1); color[rt] += ad; return; } down(rt, r - l + 1); LL mid = (l + r) >> 1; if (L <= mid) update(L, R, ad, lson); if (R>mid) update(L, R, ad, rson); up(rt); } LL ask(LL L, LL R, LL l, LL r, LL rt) { if (L <= l&&r <= R) return sum[rt]; LL mid = (l + r) >> 1; LL ans = 0; down(rt, r - l + 1); if (L <= mid) ans += ask(L, R, lson); if (R>mid) ans += ask(L, R, rson); return ans; } int main() { LL n, m; LL a, b, c; char str[100]; while (~scanf("%I64d%I64d", &n, &m)){ build(1, n, 1); for (LL i = 0; i<m; i++){ scanf("%s", str); scanf("%I64d%I64d", &a, &b); if (str[0] == ‘C‘){ scanf("%I64d", &c); update(a, b, c, 1, n, 1); } else{ printf("%I64d\n", ask(a, b, 1, n, 1)); } } } return 0; }
poj3468A Simple Problem with Integers区间和线段树,布布扣,bubuko.com
时间: 2024-12-29 12:11:05