Cod sursa(job #658014)

Utilizator an_drey_curentandreycurent an_drey_curent Data 7 ianuarie 2012 19:43:57
Problema Arbori de intervale Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.36 kb
#include<fstream>
#include<iostream>
using namespace std;
ifstream f("arbint.in");
ofstream g("arbint.out");
typedef struct nod{int info,st_int,dr_int;nod *st,*dr;}arbore;
int vector[1000],maxim=-1;
inline int MAXIM(int a,int b)
{
	if(a>b)
		return a;
	else
		return b;
}
int creare_rsd(arbore *&r,int st_int,int dr_int)
{
	int mij=(dr_int+st_int)/2;
	r=new arbore;
	r->st_int=st_int;
	r->dr_int=dr_int;
	if(st_int!=dr_int)
	{
		r->info=MAXIM(creare_rsd(r->st,st_int,mij),creare_rsd(r->dr,mij+1,dr_int));
	}
	else
	{
		r->info=vector[st_int];
		return r->info;
	}
}
void afisare_interval(arbore *&r,int st_int,int dr_int)
{
	int mij=(r->st_int+r->dr_int)/2;
	if(r->st_int>=st_int&&r->dr_int<=dr_int)
	{
		if(maxim<r->info)
			maxim=r->info;
	}
	else
	{
		if(mij<dr_int)
			afisare_interval(r->dr,st_int,dr_int);
		if(st_int<=mij)
			afisare_interval(r->st,st_int,dr_int);
	}
}
int main()
{
	int M,i,N,st_int,dr_int,operatie,poz,val;
	arbore *r;
	f>>N>>M;
	for(i=1;i<=N;i++)
		f>>vector[i];
	r=new arbore;
	r->st_int=1;
	r->dr_int=N;
	creare_rsd(r,1,N);
	for(i=1;i<=M;i++)
	{
		f>>operatie;
		if(operatie)
		{
			f>>poz>>val;
			vector[poz]=val;
			creare_rsd(r,1,N);
		}
		else
			if(operatie==0)
			{
				f>>st_int>>dr_int;
				afisare_interval(r,st_int,dr_int);
				g<<maxim<<endl;
				maxim=-1;
			}
	}
	return 0;
}