hdu 1166 敌兵布阵 单点更新模板

来源:互联网 发布:信阳师范学院网络教学 编辑:程序博客网 时间:2024/05/01 15:05
#include <iostream>#include <queue>#include <string.h>#include <stdio.h> using namespace std;#define lson l, mid, rt << 1#define rson mid+1, r, rt << 1 | 1const int N = 50005;struct node{int l, r;int x;}tr[N*4];int n;void build( int l, int r, int rt ){if( l == r ){tr[rt].l = l;tr[rt].r = r;scanf("%d", &tr[rt].x);return;}tr[rt].l = l;tr[rt].r = r;int mid = ( l + r) >> 1;build( lson );build( rson );tr[rt].x = tr[rt<<1].x + tr[rt<<1|1].x;}int query( int l, int r, int rt ){if( tr[rt].l == l && tr[rt].r == r )return tr[rt].x;int mid = ( tr[rt].l + tr[rt].r ) >> 1;if( r <= mid )return query( l, r, rt << 1 );else if( l > mid )return query( l, r, rt << 1 | 1 );elsereturn ( query( l, mid, rt << 1 ) + query( mid+1, r, rt << 1 | 1) );}void update( int a, int b, int rt ){if( tr[rt].l == tr[rt].r && tr[rt].l == a ){tr[rt].x += b;return;}else{int mid = ( tr[rt].l + tr[rt].r ) >> 1;if( a <= mid )update( a, b, rt << 1);elseupdate( a, b, rt << 1 | 1);tr[rt].x = tr[rt<<1].x + tr[rt<<1|1].x;}}int main(){int cas = 1, tot;scanf("%d", &tot);while( tot-- ){scanf("%d", &n);build( 1, n, 1 );printf("Case %d:\n", cas++ );char op[10];int a, b;while( scanf("%s", op), strcmp( op, "End" )){scanf("%d%d", &a, &b);if( !strcmp( op, "Add" ) )update( a, b, 1 );else if( !strcmp( op, "Sub" ) )update( a, -b, 1 );else{int ans = query(a, b, 1);printf("%d\n", ans);}}}return 0;}

0 0
原创粉丝点击