1 10 1 2 3 4 5 6 7 8 9 10 Query 1 3 Add 3 6 Query 2 7 Sub 10 2 Add 6 3 Query 3 10 EndSample Output
Case 1: 6 33
59
代码如下(学长的代码,我只是学习学习):
#include
#include
#include
#include
using namespace std;
#define MAXN 100010
int T;
int n;
int a[MAXN];
int tree[MAXN];
void InitTree(int k,int l,int r)
{
if(l>=r) return;
if(l+1==r)
tree[k]=a[l];
else
{
int m=(l+r)/2;
InitTree(2*k+1,l,m);
InitTree(2*k+2,m,r);
tree[k]=tree[2*k+1]+tree[2*k+2];
}
}
void Change(int k,int id,int add,int l,int r)
{
if(id=r) return;
if(l+1==r)
{
tree[k]+=add;
return;
}
else
{
int m=(l+r)/2;
Change(2*k+1,id,add,l,m);
Change(2*k+2,id,add,m,r);
tree[k]=tree[2*k+1]+tree[2*k+2];
}
}
int Query(int k,int a,int b,int l,int r)
{
if(a>=r || b<=l) return 0;
if(a<=l && b>=r)
{
return tree[k];
}
else
{
int m=(l+r)>>1;
int s1=Query(2*k+1,a,b,l,m);
int s2=Query(2*k+2,a,b,m,r);
return s1+s2;
}
}
char str[10];
int Case=0;
int main()
{
scanf("%d",&T);//T组数据
while(T--)
{
scanf("%d",&n);//n个阵营
for(int i=0;i