Cod sursa(job #1216231)

Utilizator IulianBoboUAIC Boboc Iulian IulianBobo Data 3 august 2014 19:58:04
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.08 kb
#include <iostream>
#include <fstream>
using namespace std;
int maxim,poz,value,st,dr;
int maxnod[400066];

int Max(int a,int b)
{
	return ((a>b)?a:b);
}
void Update(int nod,int left,int right)
{
	if(left==right)
	{
		maxnod[nod]=value;
	}
	else
	{
		int mid;
		mid=(left+right)/2;
		if(mid>=poz) Update(2*nod,left,mid);
		else Update(2*nod+1,mid+1,right);
		maxnod[nod]=Max(maxnod[2*nod],maxnod[2*nod+1]);
	}
}

void Query(int nod,int left,int right)
{
	int mij;
	if(st<=left && right<=dr)
	{
		if(maxnod[nod]>maxim) maxim=maxnod[nod];
	}
	else
	{
		mij=(left+right)/2;
		if(st<=mij) Query(2*nod,left,mij);
		if(mij<dr) Query(2*nod+1,mij+1,right);
	}
}
int main()
{
	ifstream f("arbint.in");
	ofstream g("arbint.out");
	int n,m,tip,a,b,i;
	f>>n>>m;
	for(i=1;i<=n;++i)
	{
		f>>a;
		poz=i;
		value=a;
		Update(1,1,n);
	}
	for(i=1;i<=m;++i)
	{
		f>>tip>>a>>b;
		if(tip==0)
		{
			maxim=-1;
			st=a;dr=b;
			Query(1,1,n);
			g<<maxim<<"\n";
		}
		else
		{
			value=b;
			poz=a;
			Update(1,1,n);
		}
	}
	f.close();
	g.close();
	return 0;
}