Cod sursa(job #186760)

Utilizator Spike7d8Cristian Varvara Spike7d8 Data 28 aprilie 2008 19:13:58
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.01 kb
#define _CRT_SECURE_NO_WARNINGS

#include <cstdio>
#define max(a, b) (a > b? a: b)

int v[400384];


void update(int n, int l, int r, int p, int x)
{
	if (l == r)
		v[n] = x;
	else
	{
		int m = (l + r) / 2;
		if (p <= m)
			update(2 * n, l, m, p, x);
		else
			update(2 * n + 1, m + 1, r, p, x);
		v[n] = max(v[2 * n], v[2 * n + 1]);
	}
}


int query(int n, int l, int r, int a, int b)
{
	if (a <= l && r <= b)
		return v[n];

	int m = (l + r) / 2, r1 = 0, r2 = 0;

	if (a <= m)
		r1 = query(2 * n, l, m, a, b);
	if (m < b)
		r2 = query(2 * n + 1, m + 1, r, a, b);

	return max(r1, r2);
}


int main()
{
	freopen("arbint.in", "rt", stdin);
	freopen("arbint.out", "wt", stdout);

	int n, m;
	scanf("%d%d", &n, &m);

	for (int a, i = 1; i <= n; i++)
	{
		scanf("%d", &a);
		update(1, 1, n, i, a);
	}

	while (m--)
	{
		int o, a, b;
		scanf("%d%d%d", &o, &a, &b);

		if (o == 0)
			printf("%d\n", query(1, 1, n, a, b));
		else
			update(1, 1, n, a, b);
	}

	return 0;
}