Cod sursa(job #520359)

Utilizator Andreid91Ciocan Andrei Andreid91 Data 8 ianuarie 2011 10:47:44
Problema Arbori de intervale Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.16 kb
#include<fstream.h>
#include<algorithm>

using namespace std;

#define maxim(a, b) (a>b? a:b)

int n,q,v[100005],ai[400000];

void cst(int k, int st, int dr)
{
	if (st==dr)
	{
		ai[k]=v[st];
		return;
	}
	
	int mij=(st+dr)/2;
	
	cst(2*k,st,mij);
	cst(2*k+1,mij+1,dr);
	
	ai[k]=maxim(ai[k*2],ai[k*2+1]);
}

int getmax(int k, int st, int dr, int a, int b)
{
	if (st>=a && dr<=b)
		return ai[k];
	
	int mij=(st+dr)/2;
	int val=0;
	
	if (mij>=a)
		val=getmax(2*k,st,mij,a,b);
	if (mij<b)
		val=maxim(val, getmax(2*k+1,mij+1,dr,a,b));
	
	return val;
}	

void update( int k, int st, int dr, int poz)
{
	if (st==dr)
	{
		ai[k]=v[poz];
		return;
	}
	
	int mij=(st+dr)/2;
	
	if (mij>=poz)
		update(k*2,st, mij, poz);
	else
		update (k*2+1, mij+1, dr, poz);
	
	ai[k]=maxim(ai[k*2],ai[k*2+1]);
	
}

int main ()
{
	int op,i,j,a,b;
	ifstream f("arbint.in");
	ofstream g("arbint.out");
	f>>n>>q;
	for (i=1;i<=n;i++)
		f>>v[i];
	cst(1,1,n);
	
	for (i=1;i<=q;i++)
	{
		f>>op;
		f>>a>>b;
		if (op==0)
			g<<getmax (1,1,n,a,b)<<'\n';
		else
		{
			v[a]=b;
			update (1,1,n,a);
		}
	}
	
	f.close();
	g.close();
	return 0;
}