Cod sursa(job #631418)

Utilizator ELHoriaHoria Cretescu ELHoria Data 7 noiembrie 2011 22:59:34
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.09 kb
#include <fstream>

using namespace std;

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

int Maxarb[1<<18] , N , M , ans;

static inline int MAX(int a,int b)
{
	return a > b ? a : b;
}

void query(int nod,int left,int right,const int &start,const int &finish)
{
	if(start<=left && right<=finish)
		ans = max(ans,Maxarb[nod]);
	else
	{
		int mid = (left + right)>>1;
		if(start <= mid) query(nod<<1,left,mid,start,finish);
		if(finish > mid) query((nod<<1) + 1,mid + 1,right,start,finish);
	}
}

void update(int nod,int left,int right,const int &pos,const int &val)
{
	if(left==right)
		Maxarb[nod] = val;
	else
	{
		int mid = (left + right)>>1;
		pos > mid ? update((nod<<1) + 1,mid+1,right,pos,val) : update(nod<<1,left,mid,pos,val);
		Maxarb[nod] = MAX(Maxarb[nod<<1],Maxarb[(nod<<1) + 1]);
	}
}

int main()
{
	int X , A , B;
	fin>>N>>M;
	for(int i=1;i<=N;++i)
		fin>>X , update(1,1,N,i,X);

	for(;M;M--)
	{
		fin>>X>>A>>B;
		if(X==0)
		{
		 ans = - 1;
		 query(1,1,N,A,B);
		 fout<< ans << '\n';
		}
		else
			update(1,1,N,A,B);
	}
	return 0;
}