#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 | 1
const 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 );
else
return ( 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);
else
update( 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;
}
hdu 1166 敌兵布阵 单点更新模板
最新推荐文章于 2019-07-23 14:16:47 发布