Cod sursa(job #331560)

Utilizator c_e_manuEmanuel Cinca c_e_manu Data 14 iulie 2009 15:07:49
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.95 kb
#include<fstream>
#define MaxN 100005

using namespace std;

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

int arb[3*MaxN];
int i,Max,op,a,b,n,m;

void update(int nod, int st, int dr, int poz, int val)
{	if(st==dr)
		arb[nod]=val;
	else
	{	int mij=(st+dr)/2;
		if(poz<=mij)
			update(2*nod,st,mij,poz,val);
		else	
			update(2*nod+1,mij+1,dr,poz,val);
		arb[nod]=max(arb[2*nod],arb[2*nod+1]);
	}
}

void query(int nod, int st, int dr, int in, int sf)
{	if(st>=in&&dr<=sf)
	{	if(arb[nod]>Max)
			Max=arb[nod];
	}
	else	
	{	int mij=(st+dr)/2;
		if(in<=mij)
			query(2*nod,st,mij,in,sf);
		if(sf>mij)
			query(2*nod+1,mij+1,dr,in,sf);
	}
}

int main()
{	fin>>n>>m;
	for(i=1;i<=n;i++)
	{	fin>>a;
		update(1,1,n,i,a);
	}
	for(i=1;i<=m;i++)
	{	fin>>op;
		if(op==0)
		{	fin>>a>>b;
			Max=-1;
			query(1,1,n,a,b);
			fout<<Max<<'\n';
		}
		if(op==1)
		{	fin>>a>>b;
			update(1,1,n,a,b);
		}
	}
	return 0;
}