Cod sursa(job #1212607)

Utilizator pulseOvidiu Giorgi pulse Data 25 iulie 2014 13:06:05
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.16 kb
#include <cstdio>
#include <algorithm>
#define nmax 100005

using namespace std;

int n, m, x, arb[4 * nmax], pos, val;
int type, a, b, maxim, start, finish;

void update(int node, int l, int r)
{
	if (l == r)
	{
		arb[node] = val;
		return;
	}
	int mid = (l + r) / 2;
	if (pos <= mid)
		update(2 * node, l, mid);
	else
		update(2 * node + 1, mid + 1, r);
	arb[node] = max(arb[2 * node], arb[2 * node + 1]);
}

void query(int node, int l, int r)
{
	if (start <= l && r <= finish)
	{
		maxim = max(maxim, arb[node]);
		return;
	}
	int mid = (l + r) / 2;
	if (start <= mid)
		query(2 * node, l, mid);
	if (mid < finish)
		query(2 * node + 1, mid + 1, r);
}

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

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

		pos = i;
		val = x;
		update(1, 1, n);
	}
	for (; m; --m)
	{
		scanf("%d%d%d", &type, &a, &b);

		if (type == 0)
		{
			maxim = -1;
			start = a;
			finish = b;
			query(1, 1, n);

			printf("%d\n", maxim);
		}
		else
		{
			pos = a;
			val = b;
			update(1, 1, n);
		}
	}

	return 0;
}