传送门:点击打开链接
题目大意:
线段树入门。
线段数操作:
1:区间查询
2:单点修改
#include <cstdio>
#include <cstring>
#define maxn 50000
struct Node
{
int l,r,sum;
}tree[maxn<<2];
int n;
inline void pushup(int id)
{
tree[id].sum = tree[id<<1].sum + tree[id<<1|1].sum;
}
void update(int id,int pos,int x)
{
if(tree[id].l == tree[id].r)
{
tree[id].sum += x;
return;
}
int mid = (tree[id].l + tree[id].r)>>1;
if(pos <= mid)
update(id<<1,pos,x);
else
update(id<<1|1,pos,x);
pushup(id);
}
void build(int id,int l,int r)
{
tree[id].l = l;
tree[id].r = r;
if(l == r)
{
int x;
// printf("%d %d\n",l,r);
scanf("%d",&x);
tree[id].sum = x;
return;
}
int mid = (l+r)>>1;
build(id<<1,l,mid);
build(id<<1|1,mid+1,r);
pushup(id);
}
int query(int id,int l,int r)
{
if(tree[id].l >= l && tree[id].r <= r)
{
return tree[id].sum;
}
int res = 0;
int mid = (tree[id].l + tree[id].r)>>1;
if(l <= mid) res += query(id<<1,l,r);
if(r > mid) res += query(id<<1|1,l,r);
return res;
}
int main()
{
int T;
scanf("%d",&T);
for(int ks = 1;ks <= T;ks++)
{
printf("Case %d:\n",ks);
scanf("%d",&n);
build(1,1,n);
//printf("544\n");
while(1)
{
char a[10];
scanf("%s",a);
if(a[0] == 'Q')
{
int l,r;
scanf("%d %d",&l,&r);
printf("%d\n",query(1,l,r));
}
else if(a[0] == 'E')
{
break;
}
else if(a[0] == 'A')
{
int pos,x;
scanf("%d %d",&pos,&x);
update(1,pos,x);
}
else if(a[0] == 'S')
{
int pos,x;
scanf("%d %d",&pos,&x);
update(1,pos,-x);
}
}
}
return 0;
}