Cod sursa(job #1064622)

Utilizator NCodeMihai X NCode Data 22 decembrie 2013 03:51:34
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.17 kb

#include <fstream>

using namespace std;

int n,m;
int maxarb[500008];
int start, fin, val,loc, maxim;

void update(int,int,int);
void maxint (int,int,int);


int main(){
	
	int a,b,c;
	ifstream in("arbint.in");
	ofstream out("arbint.out");
	
	in>>n>>m;
	for (int i=1;i<=n;i++)
	{
		in>>a;
		loc=i;
		val=a;
		update(1,1,n); 
		
	}
	
	for (int i=1;i<=m;i++)
	{
		in>>a>>b>>c;
		if(a==0)
			{
				maxim=-1;
				start=b;
				fin=c;
				maxint(1,1,n);
				out<<maxim<<"\n"; 
			}
		else
			{
				loc=b;
				val=c;
				update(1,1,n);
			}	
	}	
	in.close();
	out.close();
	return 0;
}


void update(int nod, int st, int dr)
{
	
	if(st==dr) 
	{
		maxarb[nod]=val;
		return;
	}
	
	int div=(st+dr)>>1;
	if(loc<=div) 
		update(nod<<1,st,div);
	else
		update((nod<<1)+1,div+1,dr);		
		
		maxarb[nod]=maxarb[nod<<1]>maxarb[(nod<<1)+1]?maxarb[nod<<1]:maxarb[(nod<<1)+1];

}

void maxint(int nod, int st, int dr)
{
	if(start<=st&&dr<=fin)
	{
		if (maxim<maxarb[nod] ) maxim=maxarb[nod];
		return;
		
	}
	
	int div = (st+dr)>>1;
	if(start<=div) 
		maxint(nod<<1,st,div);
	if(div<fin) 
		maxint((nod<<1)+1,div+1,dr);	
}