POJ 3468

来源:互联网 发布:火并软件下载 编辑:程序博客网 时间:2024/05/16 09:39
//4796K2563MS#include <cstdio>#include <iostream>#include <cstring>#include <algorithm>#define lch(x) ((x)<<1)#define rch(x) ((x)<<1 | 1)using namespace std;typedef long long LL;const int MAX_N = 100000;LL add[MAX_N<<2];LL sum[MAX_N<<2];inline void push_up(int n){    sum[n] = sum[lch(n)] + sum[rch(n)];}inline void push_down(int n, int m){    if(add[n]){        add[lch(n)] += add[n];        add[rch(n)] += add[n];        int mid = m>>1;        sum[lch(n)] += add[n]*(m - mid);        sum[rch(n)] += add[n]*mid;        add[n] = 0;    }}void build(int n, int l, int r){    add[n] = 0;    if(l == r){        scanf("%I64d", &sum[n]);        return;    }    int mid = (l+r)>>1;    build(lch(n), l, mid);    build(rch(n), mid+1, r);    push_up(n);}void modify(int a, int b, int d, int n, int l, int r){    if(a <=l && r <= b){        add[n] += d;        sum[n] += (LL)d*(r - l + 1);        return;    }    push_down(n, r - l + 1);    int mid = (l+r)>>1;    if(a <= mid) modify(a, b, d, lch(n), l, mid);    if(mid+1 <= b) modify(a, b, d, rch(n), mid+1, r);    push_up(n);}LL query(int a, int b, int n, int l, int r){    if(a <= l && r <= b){        return sum[n];    }    push_down(n, r - l + 1);    int mid = (l+r)>>1;    LL res = 0;    if(a <= mid) res += query(a, b, lch(n), l, mid);    if(mid+1 <= b) res += query(a, b, rch(n), mid+1, r);    return res;}int main(){    int N, Q;    while(~scanf("%d%d", &N, &Q)){          build(1, 1, N);          char str[5];          int a, b, c;          for(int i=1; i<=Q; i++){              scanf("%s", str);              if(str[0] == 'C'){                scanf("%d%d%d", &a, &b, &c);                modify(a, b, c, 1, 1, N);              }              else if(str[0] == 'Q'){                scanf("%d%d", &a, &b);                printf("%I64d\n", query(a, b, 1, 1, N));              }          }    }    return 0;}

0 0
原创粉丝点击