【HU 1166】敵兵布陣-単点修正と区間求和
1277 ワード
タイトル:Nの長い数列Aで、これを操作します.1.Add/Sub i j:Aiを増加/減算します.2.Query i j:Ai++Ajの値を問い合わせる.問い合わせごとに正しい答えを出す.
作り方:入門問題は線分樹と樹状配列で全部できます.簡単です.
ツリー配列のプログラミングの複雑さが低いので、ここではツリー配列のコードだけを貼り付けます.
作り方:入門問題は線分樹と樹状配列で全部できます.簡単です.
ツリー配列のプログラミングの複雑さが低いので、ここではツリー配列のコードだけを貼り付けます.
#include
#include
#include
#include
#include
using namespace std;
int T,n,c[50010]={0};
char op[10]={0};
int lowbit(int i)
{
return i&(-i);
}
void add(int x,int a)
{
for(int i=x;i<=n;i+=lowbit(i))
c[i]+=a;
}
int sum(int x)
{
int s=0;
for(int i=x;i>0;i-=lowbit(i))
s+=c[i];
return s;
}
int query(int a,int b)
{
return sum(b)-sum(a-1);
}
int main()
{
scanf("%d",&T);
for(int t=1;t<=T;t++)
{
scanf("%d
",&n);
memset(c,0,sizeof(c));
for(int i=1;i<=n;i++)
{
int a;
scanf("%d",&a);
if (i==n) scanf("
");
add(i,a);
}
printf("Case %d:
",t);
scanf("%s",op);
while(op[0]!='E')
{
int a,b;
scanf("%d %d
",&a,&b);
if (op[0]=='A') add(a,b);
if (op[0]=='S') add(a,-b);
if (op[0]=='Q') printf("%d
",query(a,b));
scanf("%s",op);
}
}
return 0;
}