Cod sursa(job #524792)

Utilizator Cosmin1490Balan Radu Cosmin Cosmin1490 Data 22 ianuarie 2011 23:51:43
Problema Arbori de intervale Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.37 kb
#include<fstream>
using namespace std;

#define NMAX 1000010

const char infile[]="arbint.in";
const char outfile[]="arbint.out";

long long A[NMAX];
int N;

void update(int indice,int stanga,int dreapta,int a,int b,long long x)
{

	if(a<=stanga && dreapta <=b)
	{
		A[indice]=x;
	}
	else
	{
		int mij=(stanga+dreapta)/2;
		if (a<=mij)
		{
			update(indice*2,stanga,mij,a,b,x);
		}
		if(mij<b)
		{
			update(indice*2+1,mij+1,dreapta,a,b,x);
		}
		A[indice]= A[indice*2] > A[indice*2+1] ? A[indice *2] : A[indice*2+1];
	}
	
}

long long query(int indice,int stanga,int dreapta,int a,int b)
{
	if( a<= stanga && dreapta <= b)
		return A[indice];
	else
	{
		long long x,y;
		x=y=0;
		int mij=(stanga+dreapta)/2;
		if( a<=mij)
		{
			x=query(indice*2,stanga,mij,a,b);
		}
		if( b>mij)
		{
			y=query(indice*2+1,mij+1,dreapta,a,b);
		}
		return x > y ? x : y;
	}
}

void citire()
{

	int M;
	fstream fin(infile,ios::in);
	fstream fout(outfile,ios::out);
	fin>>N>>M;
	int x;

	for(int i=1;i<=N;i++)
	{

		fin>>x;
		update(1,1,N,i,i,x);

	}

	int y,z;
	long long t;
	for(int i=1;i<=M;i++)
	{
		fin>>x;
		switch(x)
		{
		case(0):
			fin>>y>>z;
			fout<<query(1,1,N,y,z)<<"\n";
			break;
		case(1):
			fin>>y>>t;
			update(1,1,N,y,y,t);
			break;
		}
	}

	fin.close();
	fout.close();
}

int main()
{
	citire();
}