Cod sursa(job #551460)

Utilizator bent_larsenSturzu Antonio-Gabriel bent_larsen Data 10 martie 2011 20:01:05
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.21 kb
#include<fstream>
using namespace std;

const int NMAX=262144;
int ai[NMAX]={0};

inline int max(int a, int b)
{
	if(a>=b)
		return a;
	return b;
}

void update(const int& nod, const int& a, const int& b, const int& index, const int& value)
{
	if(a==b && b==index)
	{
		ai[nod]=value;
		return;
	}

	int mid=a+(b-a)/2;
	if(index<=mid)
		update(2*nod+1,a,mid,index,value);
	if(index>mid)
		update(2*nod+2,mid+1,b,index,value);
	ai[nod]=max(ai[2*nod+1],ai[2*nod+2]);
}


int query(const int& nod, const int& a, const int& b, const int& left, const int& right)
{
	int sum=0;

	if(left<=a && b<=right)
	{
		sum+=ai[nod];
		return sum;
	}

	int mid=a+(b-a)/2;
	if(left<=mid)
		sum+=query(2*nod+1,a,mid,left,right);
	if(right>mid)
		sum+=query(2*nod+2,mid+1,b,left,right);
	return sum;
}

int main()
{
	ifstream in("arbint.in");
	ofstream out("arbint.out");

	int n,m,nr,tip,a,b;
	in>>n>>m;

	//Build the interval tree
	for(int i=0;i<n;i++)
	{
		in>>nr;
		update(0,0,n-1,i,nr);
	}
	for(int i=0;i<m;i++)
	{
		in>>tip>>a>>b;
		if(tip==0)
		{
			--a,--b;
			out<<query(0,0,n-1,a,b)<<"\n";
		}
		else
		{
			--a;
			update(0,0,n-1,a,b);
		}
	}
	in.close();
	out.close();
}