Cod sursa(job #425330)

Utilizator raduzerRadu Zernoveanu raduzer Data 25 martie 2010 17:45:22
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.1 kb
#include <cstdio>
#include <algorithm>
using namespace std;

const int MAX_N = 100010;

int aint[MAX_N * 4];
int n, m;

void update(int nod, int st, int dr, int poz, int val)
{
	if (st == dr)
	{
		aint[nod] = val;
		return;
	}

	int mij = (st + dr) / 2;

	if (poz <= mij)
		update(nod * 2, st, mij, poz, val);
	else
		update(nod * 2 + 1, mij + 1, dr, poz, val);

	aint[nod] = max(aint[nod * 2], aint[nod * 2 + 1]);
}

int query(int nod, int st, int dr, int l, int r)
{
	int ret = 0;

	if (l <= st && dr <= r)
		return aint[nod];

	int mij = (st + dr) / 2;

	if (l <= mij)
		ret = max(ret, query(nod * 2, st, mij, l, r));
	if (r > mij)
		ret = max(ret, query(nod * 2 + 1, mij + 1, dr, l, r));

	return ret;
}

int main()
{
	int x, i;
	freopen("arbint.in", "r", stdin);
	freopen("arbint.out", "w", stdout);

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

	int pow;
	for (pow = 1; pow <= n; pow <<= 1);

	for (i = 1; i <= n; ++i)
	{
		scanf("%d", &x);

		update(1, 1, pow, i, x);
	}

	for (i = 1; i <= m; ++i)
	{
		int q, y;

		scanf("%d %d %d", &q, &x, &y);

		if (!q)
			printf("%d\n", query(1, 1, pow, x, y));
		else
			update(1, 1, pow, x, y);
	}
}