Cod sursa(job #578083)

Utilizator AnteusPatrascoiu Mihai Anteus Data 10 aprilie 2011 22:43:03
Problema Arbori de intervale Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 0.91 kb
#include <stdio.h>
FILE *f=fopen ("arbint.in", "r");
FILE *g=fopen ("arbint.out", "w");
const int r=100001;
int n,m,i,x,y,k,max;
int v[4*r];

int maxim(int a, int b)
{
	return (a>b) ? a : b;
}

void update(int poz, int ls, int ld) {
int h;
	if (ls==ld)
	{
		v[poz]=y;
		return;
	}
	
	h=(ls+ld)/2;
	if (x<=h)	update(2*poz, ls, h);
	else		update(2*poz+1, h+1, ld);
	
	v[poz]=maxim(v[2*poz], v[2*poz+1]);
}

void find(int poz, int ls, int ld) {
int h;
	if (x<=ls && ld<=y)
	{
		max=maxim(max, v[poz]);
		return;
	}
	
	h=(ls+ld)/2;
	if (x<=h)	find(2*poz, ls, h);
	if (y>h)	find(2*poz+1, h+1, ld);
}

int main()	{    
fscanf(f, "%d%d", &n,&m);

for (i=1;i<=n;i++)
{
	fscanf (f, "%d", &y);	x=i;
	update(1,1,n);
}

for (i=1;i<=m;i++)
{
	fscanf (f, "%d%d%d", &k,&x,&y);
   
	if (k)
	   update(1,1,n);
	else
	{
		max=0;
		find(1,1,n);
		fprintf (g, "%d\n", max);
	}
}

return 0;
}