Cod sursa(job #181894)

Utilizator vlad.maneaVlad Manea vlad.manea Data 19 aprilie 2008 10:06:18
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.41 kb
#include <stdio.h>
#include <values.h>
#define nmax 100666
#define infinit (MAXINT/2)

int max[nmax<<2], V[nmax];

int N, M;

int care(int l, int r)
{
	return l > r? l: r;
}

void create(int node, int l, int r)
{
	if (l == r)
		max[node] = V[l];
	else if (l < r)
	{
		int m = (l+r)>>1;

		create(node<<1, l, m);
		create(node<<1|1, m+1, r);

		max[node] = care(max[node<<1], max[node<<1|1]);
	}
}

int query(int node, int a, int b, int l, int r)
{
	if (a <= l && r <= b)
		return max[node];
	else
	{
		int m = (l+r)>>1, maxim = -infinit;

		if (a <= m)
			maxim = care(maxim, query(node<<1, a, b, l, m));

		if (b > r)
			maxim = care(maxim, query(node<<1|1, a, b, m+1, r));

		return maxim;
	}
}

void insert(int node, int a, int b, int l, int r)
{
	// a este pozitia
	if (l == a && a == r)
		max[node] = b;
	else
	{
		int m = (l+r)>>1;

		if (a <= m)
			insert(node<<1, a, b, l, m);
		else
			insert(node<<1|1, a, b, m+1, r);

		max[node]= care(max[node<<1], max[node<<1|1]);
	}
}

int main()
{
	int i, t, a, b;

	freopen("arbint.in", "r", stdin);
	freopen("arbint.out", "w", stdout);

	scanf("%d%d", &N, &M);

	for (i = 1; i <= N; ++i)
		scanf("%d", &V[i]);

	create(1, 1, N);

	for (i = 1; i <= M; ++i)
	{
		scanf("%d%d%d", &t, &a, &b);
		if (t == 0)
			printf("%d\n", query(1, a, b, 1, N));
		else
			insert(1, a, b, 1, N);
	}

	return 0;
}