Cod sursa(job #1201993)

Utilizator vasile_pojogaPojoga Vasile vasile_pojoga Data 26 iunie 2014 16:22:44
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.28 kb
#include <fstream>

using namespace std;

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

int MaxArb[4*100025],n,m,pos,val,lPoz,rPoz,maximum;

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

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

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

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

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];
	}
}

void update(int nod, int left, int right)
{
	if(left == right)
	{
		MaxArb[nod] = val;
	}
	else
	{
		int mid = (left + right) / 2;
		if(pos <= mid)
		{
			update(2*nod,left,mid);
		}
		else
		{
			update(2*nod+1,mid+1,right);
		}
		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));
	}
}

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

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