线段树的模板

#include <iostream>
#include <cstdio>
#include <cstring>
#include <map>
#include <algorithm>
#include <string>
using namespace std;

struct stu
{
	int l,r,num;
}ye[500005];

void init_tree(int l,int r,int k)
{
	ye[k].l=l;
	ye[k].r=r;
	ye[k].num=0;
	if(r == l)
		return;
	int mid = (l + r)/2;
	init_tree(l,mid,k*2);
	init_tree(mid+1,r,k*2+1);
}


void updata_tree(int i,int add,int k)
{
	if(ye[k].l == i && ye[k].r == i)
	{
		ye[k].num+=add;
		return;
	}
	int mid = (ye[k].l + ye[k].r)/2;
	if(mid >= i)
	{
		updata_tree(i,add,k*2);
	}
	else
	{
		updata_tree(i,add,k*2+1);
	}
	ye[k].num=ye[k*2].num+ye[k*2+1].num;
}


int sum;
void search_tree(int l,int r,int k)
{
	if(ye[k].l == l && ye[k].r == r)
	{
		sum+=ye[k].num;
		return;
	}
	int  mid=(ye[k].l + ye[k].r)/2;
	if(mid >= r)
	{
		search_tree(l,r,k*2);
	}
	else if(mid < l)
	{
		search_tree(l,r,k*2+1);
	}
	else
	{
		search_tree(l,mid,k*2);
		search_tree(mid+1,r,k*2+1);
	}
}

int main()
{
	int t,ss=0,i,a;
	char st[20];
	scanf("%d",&t);
	while(t--)
	{
		int n;
		scanf("%d",&n);

		init_tree(1,n,1);

		for(i = 1 ; i <= n ; i++)
		{
			scanf("%d",&a);
			updata_tree(i,a,1);
		}

		printf("Case %d:\n",++ss);

		while(scanf("%s",&st) && st[0] != 'E')
		{
			sum=0;
			int a,b;

			if(st[0] == 'A')
			{
				scanf("%d %d",&a,&b);
				updata_tree(a,b,1);
			}

			else if(st[0] == 'S')
			{
				scanf("%d %d",&a,&b);
				updata_tree(a,-b,1);
			}

			else
			{
				scanf("%d %d",&a,&b);
				search_tree(a,b,1);
				printf("%d\n",sum);
			}
		}
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/hujinhong145/article/details/81258916