Cod sursa(job #151324)

Utilizator alextheroTandrau Alexandru alexthero Data 7 martie 2008 23:38:24
Problema Arbori de intervale Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.36 kb
#include <stdio.h>

#define nmax 100005
#define arbmax 600005
#define max(i,j) ((i) > (j) ? (i) : (j))

int n, m, t, n1, n2;
int a[nmax], arb[nmax];

void init(int nod, int first, int last)
{
	if(first == last) arb[nod] = a[first];
	else
	{
		int middle = (first + last) / 2;
		init(nod * 2, first, middle);
		init(nod * 2 + 1, middle + 1, last);
		arb[nod] = max(arb[nod * 2], arb[nod * 2 + 1]);
	}
}

void update(int nod, int first, int last, int p)
{
	if(first == last) arb[nod] = a[first];
	else
	{
		int middle = (first + last) / 2;
		if(p <= middle) update(nod * 2, first, middle, p);
		else update(nod * 2 + 1, middle + 1, last, p);
		arb[nod] = max(arb[nod * 2], arb[nod * 2 + 1]);
	}
}

int query(int nod, int first, int last, int a, int b)
{
	if(a <= first && last <= b) return arb[nod];
	else
	{
		int middle = (first + last) / 2;
		int rez = 0;
		if(a <= middle) rez = max(rez, query(nod * 2, first, middle, a, b));
		if(b > middle) rez = max(rez, query(nod * 2 + 1, middle + 1, last, a, b));
		return rez;
	}
}

int main()
{
	freopen("arbint.in", "r", stdin);
	freopen("arbint.out", "w", stdout);
	
	scanf("%d%d", &n, &m);
	for(int i = 1; i <= n; i++) scanf("%d", &a[i]);

	init(1, 1, n);
	for(int i = 1; i <= m; i++)
	{
		scanf("%d%d%d", &t, &n1, &n2);
		if(t == 0) printf("%d\n", query(1, 1, n, n1, n2));
		else 
		{
			a[n1] = n2;
			update(1, 1, n, n1);
		}
	}

	return 0;
}