hdu 1166 敌兵布阵 线段树
2013-11-18 01:39
351 查看
#include <iostream> #include <cstring> #include <algorithm> #include <cstdio> #define lson l, m, rt << 1 #define rson m+1, r, rt << 1 | 1 using 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; }
相关文章推荐
- [HDU][线段树]1166.敌兵布阵
- hdu 1166 敌兵布阵(线段树单点更新(a位置的值+/-b)+区间求和)
- HDU1166敌兵布阵-线段树求和
- hdu 1166 敌兵布阵 线段树 单点更新
- hdu1166敌兵布阵(线段树)
- HDU - 1166 敌兵布阵 (线段树)
- HDU 1166 敌兵布阵(线段树)
- hdu 1166 敌兵布阵(线段树,只更新叶子节点)
- HDU-1166 敌兵布阵 ( 线段树 )
- HDU - 1166 敌兵布阵 线段树区间查询
- hdu 1166 敌兵布阵 线段树单点更新
- HDU 1166 敌兵布阵 (线段树点更新区间查询)
- HDU1166-线段树模版-敌兵布阵
- HDU 1166 敌兵布阵(树状数组 or 线段树 单点修改 区间求和)
- HDU 1166:敌兵布阵(线段树入门)
- 敌兵布阵 HDU - 1166 (线段树单点更新)
- HDU-1166 敌兵布阵(树状数组和线段树)
- HDU1166 敌兵布阵 【线段树】
- hdu 1166 敌兵布阵 (线段树)
- HDU 1166 敌兵布阵(线段树)(第一部分 单点更新)