[Codevs] 1080 线段树练习

Portal:http://codevs.cn/problem/1080/


这道题倒是点醒了我:树状数组和线段树不一样(半小时前才学的概念傻傻分不清)。

主要思路是利用树状数组储存前缀和,然后前缀和相减得到区间和。

线段树的知识在蓝书里出现了,,,莫名其妙就从紫书升级了??


Mark下我看的那篇博客:http://blog.csdn.net/dcrusher/article/details/49497395

(这位也是厉害,用三种方法)


#include
#include
using namespace std;

int Tree[999999],n,m;

int lowbit(int x)
{
	return x&(-x);
}

int add(int pos,int v)
{
	int j;
	for(j = pos;j <= n;j += lowbit(j))
	{
		Tree[j] += v;
	}
	return 0;
}

int sch(int pos)
{
	int ans = 0,j;
	for(j = pos;j >= 1;j -= lowbit(j))
		ans += Tree[j];
		
	return ans;
}

int main()
{
	int a,b,c;
	scanf("%d",&n);
	for(int i = 1;i <= n;i++)
	{
		scanf("%d",&a);
		add(i,a);
	}
	
	scanf("%d",&m);
	for(int i = 0;i < m;i++)
	{
		scanf("%d%d%d",&a,&b,&c);
		switch(a)
		{
			case 1:
				add(b,c);
				break;
			case 2:
				int s1,s2;
				s1 = sch(b-1);
				s2 = sch(c);
				printf("%d\n",s2-s1);
				break;
		}
	}
	return 0;
}


你可能感兴趣的:(OI-数据结构)