Cod sursa(job #713930)

Utilizator RoswenRus Alexandru Roswen Data 15 martie 2012 10:08:01
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.14 kb
#include<stdio.h>
#define N 100005
FILE *f=fopen("arbint.in","r"), *g=fopen("arbint.out","w");
int a[N*4+N/2], start, final, pos, val, maxim,n,m, test;
int max(int a, int b)
{
	if(a>b)
		return a;
	else return b;
}
void update(int nod, int left, int right)
{
	if(left == right)
	{
		a[nod]= val;
		return;
	}
	else 
	{
		int div=left+(right-left)/2;
		if( pos<= div )
			update(2*nod, left, div);
		else update(2*nod+1, div+1, right);
	}
	
	a[nod]= max( a[nod*2], a[nod*2+1]);
}

void caut(int nod, int left, int right)
{
	if( start<= left && right<= final)
	{
		if(maxim < a[nod])
			maxim=a[nod];
		return;
	}
	
	int div= left + (right-left)/2;
	if(start<=div)
		caut(2*nod, left, div);
	if(div<final)
		caut(2*nod+1, div+1, right);
}
int main()
{
	fscanf(f,"%d %d", &n, &m);
	for(int i=1; i<=n;i++)
	{
		fscanf(f,"%d", &val);
		pos=i;
		update(1,1,n);
	}
	for(int i=1;i<=m;i++)
	{
		fscanf(f, "%d %d %d", &test, &start, &final);
		if(test==0)
		{
			maxim=-1;
			caut(1, 1, n);
			
			fprintf(g,"%d\n", maxim);
		}
		else 
		{
			pos=start, val=final;
			update(1,1,n);
		}
		
	}
	return 0;
}