Cod sursa(job #161919)

Utilizator vlad.maneaVlad Manea vlad.manea Data 18 martie 2008 23:08:09
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.47 kb
#include <stdio.h>
#include <values.h>
#define nmax 500000
#define infinit (MAXINT/2)

int max[nmax], A[nmax], N, M;

void create(int node, int i, int j)
{
	if (i == j)
	{
		max[node] = A[i];
		return;
	}

	int m = (i+j)>>1;

	create(node<<1, i, m);
	create(node<<1|1, m+1, j);

	max[node] = max[node<<1]>max[node<<1|1]?max[node<<1]:max[node<<1|1];
}

int maximm(int node, int i, int j, int a, int b)
{
	if (i <= a && b <= j)
		return max[node];

	int m = (a+b)>>1, maxim = -infinit, news;

	if (i <= m)
	{
		news = maximm(node<<1, i, j, a, m);
		if (news > maxim)
			maxim = news;
	}

	if (j > m)
	{
		news = maximm(node<<1|1, i, j, m+1, b);
		if (news > maxim)
			maxim = news;
	}

	return maxim;
}

void update(int node, int i, int j, int a, int b, int value)
{
	if (i <= a && b <= j)
	{
		max[node] = value;
		return;
	}

	int m = (a+b)>>1;

	if (i <= m)
		update(node<<1, i, j, a, m, value);

	if (j > m)
		update(node<<1|1, i, j, m+1, b, value);

	max[node] = max[node<<1]>max[node<<1|1]?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", &A[i]);

	create(1, 1, N);

	for (i = 1; i <= M; ++i)
	{
		scanf("%d%d%d", &t, &a, &b);

		if (t == 0)
			printf("%d\n", maximm(1, a, b, 1, N));
		else
			update(1, a, a, 1, N, b);
	}

	return 0;
}