CCNUOJ 1031 数组操作(树状数组)

最基本的树状数组操作,卡了半天,是因为为了节省几KB内存,树状数组用了short存,导致结果错误!!

#include<stdio.h>

#include<string.h>

short a[100005];

int c[100005],n;

int lowbit(int i)

{

   return i&(-i);

}

void add(int i,int v)

{

   while (i<=n)

   {

      c[i]+=v;

      i+=lowbit(i);

   }

}

int sum(int i)

{

   int s=0;

   while (i>0)

   {

      s+=c[i];

      i-=lowbit(i);

   }

   return s;

}

int main()

{

	int i,m,x,y,z,p,q;

	while(scanf("%d%d",&n,&m)==2)

	{

		memset(c,0,sizeof(c));

		for(i=1;i<=n;i++)

		{

			scanf("%d",&a[i]);

			add(i,a[i]);

		}

		while(m--)

		{

			scanf("%d%d%d",&x,&y,&z);

			if(x-1)

			{

				p=z>y?z:y;q=z<y?z:y;

				printf("%d\n",sum(p)-sum(q-1));

			}

			else

			{

				add(y,z-a[y]);

				a[y]=z;

			}

		}

	}

	return 0;

}

  

你可能感兴趣的:(树状数组)