Cod sursa(job #681619)

Utilizator an_drey_curentandreycurent an_drey_curent Data 17 februarie 2012 15:49:58
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.2 kb
#include<stdio.h>
#define MAX 100001
int ARB[4*MAX],M,N,POZ,VAL,sfarsit,start,REZULTAT;
int maxim(int x,int y)
{if(x>y) return x; return y;}
void deschidere()
{
	freopen("arbint.in","r",stdin);
	freopen("arbint.out","w",stdout);
}
void actualizare(int NOD,int st,int dr)
{
	if (st==dr)
	{
		ARB[NOD]=VAL;
		return;
	}
	int mij = (st+dr)/2;
	if(POZ<=mij)
		actualizare(NOD*2,st,mij);
	else
		actualizare(NOD*2+1,mij+1,dr);
	ARB[NOD]=maxim(ARB[NOD*2],ARB[NOD*2+1]);
}
void interogare(int NOD,int st,int dr)
{
	if(st>=start&&dr<=sfarsit)
	{
		if(ARB[NOD]>REZULTAT)
			REZULTAT=ARB[NOD];
		return ;
	}
	int mij= (st+dr)/2;
	if(start<=mij)
		interogare(NOD*2,st,mij);
	if(sfarsit>mij)
		interogare(NOD*2+1,mij+1,dr);
}
void citire()
{
	scanf("%d%d",&N,&M);
	for(int i=1;i<=N;i++)
	{
		scanf("%d",&VAL);POZ=i;
		actualizare(1,1,N);
	}	
}
void rezolvare()
{
	REZULTAT=0;int operatie;
	while(M--)
	{
		scanf("%d%d%d",&operatie,&start,&sfarsit);
		if(operatie==0)
		{
			interogare(1,1,N);
			printf("%d\n",REZULTAT);
			REZULTAT=0;
		}
		else
		{
			POZ=start,VAL=sfarsit;actualizare(1,1,N);
		}
	}
}
int main()
{
	deschidere();
	citire();
	rezolvare();
	return 0;
}