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;}

原创粉丝点击