Cod sursa(job #295570)

Utilizator cotofanaCotofana Cristian cotofana Data 3 aprilie 2009 13:51:32
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.13 kb
#include <stdio.h>
#define dim 100100

int n, m, pos, val, start, end, maxim, arb[4*dim+66];

inline int max(const int a, const int b)
{
	return a>b?a:b;
}

void update(int, int, int);
void query(int, int, int);

int main()
{
	int i, op, x, y;
	freopen("arbint.in", "r", stdin);
	freopen("arbint.out", "w", stdout);
	scanf("%d %d\n", &n, &m);
	for (i=1; i<=n; i++)
	{
		scanf("%d ", &x);
		pos=i, val=x;
		update(1, 1, n);
	}
	for (i=1; i<=m; i++)
	{
		scanf("%d %d %d\n", &op, &x, &y);
		if (!op)
		{
			maxim=-1;
			start=x, end=y;
			query(1, 1, n);
			printf("%d\n", maxim);
			continue;
		}
		pos=x, val=y;
		update(1, 1, n);
	}
	return 0;
}

void update(int nod, int l, int r)
{
	int div;
	if (l==r)
	{
		arb[nod]=val;
		return;
	}
	div=l+(r-l)/2;
	if (pos<=div) update(2*nod, l, div);
	else update(2*nod+1, div+1, r);
	arb[nod]=max(arb[2*nod], arb[2*nod+1]);
}

void query(int nod, int l, int r)
{
	int div;
	if (start<=l && r<=end)
	{
		if (maxim<arb[nod]) maxim=arb[nod];
		return;
	}
	div=l+(r-l)/2;
	if (start<=div) query(2*nod, l, div);
	if (div<end) query(2*nod+1, div+1, r);
}