Cod sursa(job #144808)

Utilizator filipbFilip Cristian Buruiana filipb Data 27 februarie 2008 23:21:24
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.96 kb
#include <stdio.h>

#define maxim(a, b) ((a > b) ? a : b)
#define NMax 100005
#define AMax 262144

int N, M, A[AMax];

void update(int n, int l, int r, int poz, int val)
{
	if (l == r)
	{
		A[n] = val;
		return ;
	}
	int m = (l + r) / 2;
	if (poz <= m)
		update(2*n, l, m, poz, val);
	else
		update(2*n+1, m+1, r, poz, val);
	A[n] = maxim(A[2*n], A[2*n+1]);
}

int query(int n, int l, int r, int a, int b)
{
	if (a <= l && r <= b)
		return A[n];
	int m = (l + r) / 2, i1 = 0, i2 = 0;
	if (a <= m) i1 = query(2*n, l, m, a, b);
	if (b > m) i2 = query(2*n+1, m+1, r, a, b);
	return maxim(i1, i2);
}

int main(void)
{
	int i, tip, 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);
		update(1, 1, N, i, a);
	}
	
	for (; M; --M)
	{
		scanf("%d %d %d", &tip, &a, &b);
		if (!tip)
		{
			printf("%d\n", query(1, 1, N, a, b));
			continue;
		}
		update(1, 1, N, a, b);
	}
	
	return 0;
}