poj3468 A Simple Problem with Integers

来源:互联网 发布:炉石传说 橙卡 知乎 编辑:程序博客网 时间:2024/05/18 02:01

线段树功能:update:成段增减 query:区间求和

/********************* * Author:fisty * Data:2014-10-18 * poj3468 * 线段树成段更新 *******************/#include <cstdio>#include <algorithm>using namespace std; #define lson l , m , rt << 1#define rson m + 1 , r , rt << 1 | 1typedef long long LL;const int maxn = 111111;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 m) {        //向下更新if (add[rt]) {add[rt<<1] += add[rt];add[rt<<1|1] += add[rt];sum[rt<<1] += add[rt] * (m - (m >> 1));sum[rt<<1|1] += add[rt] * (m >> 1);add[rt] = 0;}}void build(int l,int r,int rt) {add[rt] = 0;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 (m < R) 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;}


0 0