hdu 1166 敌兵布阵 线段树
来源:互联网 发布:雅思写作解题思路知乎 编辑:程序博客网 时间:2024/04/29 11:27
#include <iostream>#include <cstring>#include <algorithm>#include <cstdio>#define lson l, m, rt << 1#define rson m+1, r, rt << 1 | 1using namespace std;const int MAXN = 50010;int sum[MAXN<<2];void PushUp(int rt){ sum[rt] = sum[rt<<1] + sum[rt<<1|1];}void build(int l, int r, int rt){ if(l == r) { scanf("%d", &sum[rt]); return; } int m = (l+r)>>1; build(lson); build(rson); PushUp(rt);}void UFset(int p, int a, int l, int r, int rt){ if(l == r) { sum[rt] += a; return; } int m = (l+r) >> 1; if(p <= m) UFset(p, a, lson); else UFset(p, a, rson); PushUp( rt );}int Query(int L, int R, int l, int r, int rt){ if(L <= l && R >= r) { return sum[rt]; } int m = (l+r) >> 1; int ret = 0; if(L <= m) ret += Query(L, R, lson); if(R > m) ret += Query(L, R, rson); return ret;}int main(){int T , n;scanf("%d",&T);for (int cas = 1 ; cas <= T ; cas ++) {printf("Case %d:\n",cas);scanf("%d",&n);build(1 , n , 1);char op[10];while (scanf("%s",op)){if (op[0] == 'E') break;int a , b;scanf("%d%d",&a,&b);if (op[0] == 'Q') printf("%d\n",Query(a , b , 1 , n , 1));else if (op[0] == 'S') UFset(a , -b , 1 , n , 1);else UFset(a , b , 1 , n , 1);}}return 0;}