Cod sursa(job #356191)

Utilizator ada_sAda-Mihaela Solcan ada_s Data 13 octombrie 2009 19:36:25
Problema Arbori de intervale Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.22 kb
#include <stdio.h>
long n, m, i, j, a, b, x, arb[400000];
int tip;

long interogare(long nod, long st, long dr, long a, long b);
void modif(long nod, long st, long dr, long poz, long val);
long max(long a, long b);

int main()
{
	freopen("arbint.in", "r", stdin);
	freopen("arbint.out", "w", stdout);
	scanf("%ld%ld", &n, &m);
	for (i=1; i<=n; i++)
	{
		scanf("%ld", &x);
		modif(1, 1, n, i, x);
	}//for i
	for (i=0; i<m; i++)
	{
		scanf("%d%ld%ld", &tip, &a, &b);
		if (tip==0)
			printf("%ld\n", interogare(1, 1, n, a, b));
		if (tip==1)
			modif(1, 1, n, a, b);
	}//for i
	return 0;
}//main

long interogare(long nod, long st, long dr, long a, long b)
{
	long mij, rez;
	if ((a<=st)&&(dr<=b))
		return arb[nod];
	mij=(st+dr)/2;
	rez=-1;
	if (a<=mij)
		rez=max(rez, interogare(2*nod, st, mij, a, b));
	if (b>mij)
		rez=max(rez, interogare(2*nod+1, mij+1, dr, a, b));
	return rez;
}//interogare

void modif(long nod, long st, long dr, long poz, long val)
{
	if (st==dr)
		arb[nod]=val;
	else
	{
		int mij=(st+dr)/2;
		if (poz<=mij)
			modif(2*nod, st, mij, poz, val);
		else
			modif(2*nod+1, mij+1, dr, poz, val);
		arb[nod]=max(arb[2*nod], arb[2*nod+1]);
	}//else
}//modif

long max(long a, long b)
{
	if (a>b)
		return a;
	else
		return b;
}//max