Cod sursa(job #1201985)

Utilizator vasile_pojogaPojoga Vasile vasile_pojoga Data 26 iunie 2014 16:05:49
Problema Arbori de intervale Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.41 kb
#include <fstream>

using namespace std;

ifstream fin("arbint.in");
ofstream fout("arbint.out");

int MaxArb[4*100025],n,m;

int maxim(int a,int b);
void createMaxArb();
void update(int nod, int left, int right, int pos, int val);
int query(int nod, int left, int right, int lPoz, int rPoz);
void run();

int main()
{
	createMaxArb();
	run();
	return 0;
}

void createMaxArb()
{
	int x;
	fin>>n>>m;
	for(int i=1;i<=n;i++)
	{
		fin>>x;
		update(1,1,n,i,x);
	}
}

void run()
{
	int c,a,b;
	for(int i=0;i<m;i++)
	{
		fin>>c>>a>>b;
		if(c == 0)
		{
			fout<<query(1,1,n,a,b)<<'\n';
		}
		else
		{
			update(1,1,n,a,b);
		}
	}
}

void update(int nod, int left, int right, int pos, int val)
{
	if(left == right)
	{
		MaxArb[nod] = val;
	}
	else
	{
		int mid = (left + right) / 2;
		if(pos <= mid)
		{
			update(2*nod,left,mid,pos,val);
		}
		else
		{
			update(2*nod+1,mid+1,right,pos,val);
		}
		MaxArb[nod] = MaxArb[2*nod] > MaxArb[2*nod+1] ? MaxArb[2*nod] : MaxArb[2*nod+1];
	}
}

int query(int nod, int left, int right, int lPoz, int rPoz)
{
	if(rPoz < left || right < lPoz) //does not intersect
	{
		return -1;
	}
	if(lPoz <= left && right <= rPoz)
	{
		return MaxArb[nod];
	}
	else
	{
		int mid = (left + right) / 2;
		return maxim(query(2*nod,left,mid,lPoz,rPoz),query(2*nod+1,mid+1,right,lPoz,rPoz));
	}
}

int maxim(int a,int b)
{
	return a>b ? a : b;
}