PKU 3468

来源:互联网 发布:淘宝无线端详情页模板 编辑:程序博客网 时间:2024/05/17 01:04

与上题类似。只是变成了累加。每次更新的时候要更新sum值(加)

多了query的操作。与update类似

#include <iostream>using namespace std;#define lson l, m, rt << 1#define rson m+1, r, rt << 1 | 1#define LL long longconst int maxn = 1111111;LL add[maxn << 2];LL sum[maxn << 2];void pushUp(int rt){sum[rt] = sum[rt<<1] + sum[rt << 1 | 1];}void pushDown(int rt, int num){if(add[rt]){add[rt<<1] += add[rt];add[rt<<1|1] += add[rt];sum[rt<<1] += add[rt] * (num -(num>>1));sum[rt<<1 | 1] += add[rt] *(num >> 1);add[rt] = 0;}}void build(int l, int r, int rt){add[rt] = 0;sum[rt] = 1;if(l == r){scanf("%lld", &sum[rt]);return;}int m = (l + r) >> 1;build(lson);build(rson);pushUp(rt);}void update(int L, int R, int c, int l, int r, int rt){if(L <= l && r <= R){add[rt] += c;sum[rt] += (LL)c * (r - l+ 1);return;}pushDown(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);pushUp(rt);}LL query(int L, int R, int l, int r, int rt){if(L <= l && r <= R)return sum[rt];pushDown(rt, r-l+1);int m = (l + r) >> 1;LL ret = 0;if(L <= m) ret += query(L, R, lson);if(m < R) ret += query(L, R, rson);return ret;}int main(){int N, Q;scanf("%d%d", &N, &Q);build(1,N, 1);while(Q--){char op[2];int a, b, c;scanf("%s", op);if(op[0] == 'Q'){scanf("%d%d", &a, &b);printf("%lld\n", query(a, b, 1, N, 1));}else{scanf("%d%d%d", &a, &b, &c);update(a, b, c, 1, N, 1);}}return 0;}


原创粉丝点击