Cod sursa(job #539763)

Utilizator cezyGrigore Cezar cezy Data 23 februarie 2011 12:38:50
Problema Arbori de intervale Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 0.9 kb
#include<fstream>
#define dim 100001
using namespace std;
int v[dim],n,val,pos,maxim,s,f;
int arb[4*dim];
void Update(int nod,int l,int r)
{
	if(l==r) {arb[nod]=val;return;}
	int div=(l+r)/2;
	if(pos<=div) Update(2*nod,l,div);
	else Update(2*nod+1,div+1,r);
	arb[nod]=max(arb[2*nod],arb[2*nod+1]);
}
void Query(int nod,int l,int r)
{
	if(s<=l && r<=f)
	{
		if(maxim<arb[nod]) maxim=arb[nod];
		return;
	}
	else 
	{
		int div=(l+r)/2;
		if(s<=div) Query(2*nod,l,div);
		if(div<f) Query(2*nod+1,div+1,r);
	}
}
	
int main()
{
	int i,a,b,x,m;
	ifstream fin("arbint.in");
	ofstream fout("arbint.out");
	fin>>n>>m;
	for(i=1;i<=n;i++)
	{
		fin>>x;val=x;pos=i;
		Update(1,1,n);
	}
	
	for(i=1;i<=m;i++)
	{
		fin>>x>>a>>b;
		if(x==1) {pos=a;val=b;Update(1,1,n);}
		if(x==0) {s=a;f=b;maxim=-1;Query(1,1,n);fout<<maxim<<endl;}
		
	}
	fin.close();
	fout.close();
    return 0;

}