首页 > 代码库 > poj3468A Simple Problem with Integers区间和线段树

poj3468A Simple Problem with Integers区间和线段树

同上。。。

#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|1LL 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;}