Cod sursa(job #485001)

Utilizator raduzerRadu Zernoveanu raduzer Data 16 septembrie 2010 18:45:08
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.16 kb
#include <cstdio>
#include <algorithm>
using namespace std;

const int MAX_N = 100001;

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

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

	int mij = (l + r) / 2;

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

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

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

	int mij = (l + r) / 2, mx = 0, val = 0;

	if (st <= mij)
	{
		val = query(nod * 2, l, mij, st, dr);

		if (val > mx)
			mx = val;
	}

	if (mij < dr)
	{
		val = query(nod * 2 + 1, mij + 1, r, st, dr);

		if (val > mx)
			mx = val;
	}

	return mx;
}

int main()
{
	int i, pow;

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

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

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

	for (i = 1; i <= n; ++i)
	{
		int x;

		scanf("%d", &x);

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

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

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

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

}