线段树模板-单点增减 区间求和模板
2014-09-18 17:32
176 查看
#include <cstdio> #define lson l , m , rt << 1 #define rson m + 1 , r , rt << 1 | 1 const int maxn = 55555; 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 update(int p,int add,int l,int r,int rt) { // 第 p项 加 add if (l == r) { sum[rt] += add; return ; } int m = (l + r) >> 1; if (p <= m) update(p , add , lson); else update(p , add , rson); PushUP(rt); } int query(int L,int R,int l,int r,int rt) { // 求区间 L 到 R的和 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); // 建树 1 - n 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)); // a到 b的 和 else if (op[0] == 'S') update(a , -b , 1 , n , 1); // 第 a项 减 b else update(a , b , 1 , n , 1); // 第 a项 加 b } } return 0; }
相关文章推荐
- HDU 1166 敌兵布阵 (线段树 单点增减 区间求和 模板)
- 线段树 单点增减,单点替换,区间最值,区间求和(模板)
- HDU 1394——Minimum Inversion Number——————【线段树单点增减、区间求和】
- hdu1166(线段树单点更新&区间求和模板)
- hdu 1166 线段树(单点增减 区间求和)
- 线段树HDU——1166(单点增减、区间求和)
- hdu 1166 敌兵布阵【线段树,单点增减,区间求和】
- P3374 【模板】树状数组 1(单点增减,区间求和)
- 线段树经典操作模板(单点更新,替换;区间更新,替换;区间求和求最值)
- 线段树 --- (单点更新、区间求和、模板题)
- 1166-敌兵布阵 线段树(单点增减,区间求和)
- 敌兵布阵 HDU - 1166 (线段树单点修改区间求和模板)
- 洛谷 2068 线段树模板:单点更新,区间求和
- poj3468 A Simple Problem with Integers(线段树模板 功能:区间增减,区间求和)
- hdu 1394 Minimum Inversion Number【线段树,单点增减,区间求和】
- HDU 1166 敌兵布阵(线段树/单点增减、区间求和)
- HDU 1166 敌兵布阵 【线段树(单点增减 区间求和)】
- HDU 1166——敌兵布阵——————【线段树单点增减、区间求和】
- HDU 1166 敌兵布阵(线段树/单点增减、区间求和)
- 洛谷P3373 [模板]线段树 2(区间增减.乘 区间求和)