Cod sursa(job #674271)

Utilizator ukiandreaAndreea Lucau ukiandrea Data 5 februarie 2012 22:34:35
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.37 kb
#include <stdio.h>

int a[100000];
int max[1000000];

void initialize(int node, int b, int e)
{
	if (b == e) {
		max[node] = b;
		return;
	}

	initialize(2 * node, b, (b + e) / 2);
	initialize(2 * node + 1, (b + e) / 2 + 1, e);

	int p1 = max[2 * node];
	int p2 = max[2 * node + 1];

	max[node] = (a[p1] > a[p2]) ? p1 : p2;
}

int query(int node, int b, int e, int i, int j)
{
	if (j < b || e < i)
		return -1;

	if (i <= b && e <= j)
		return max[node];

	int m1 = query(2 * node, b, (b + e) / 2, i, j);
	int m2 = query(2 * node + 1, (b + e) / 2 + 1, e, i, j);

	if (m1 == -1)
		return m2;

	if (m2 == -1)
		return m1;

	return (a[m1] > a[m2]) ? m1 : m2;
}

void update(int node, int b, int e, int x)
{
	if (b == e)
		return;

	int m = (b + e) / 2;

	if (x <= m)
		update(2 * node, b, m, x);
	else
		update(2 * node + 1, m + 1, e, x);

	int p1 = max[2 * node];
	int p2 = max[2 * node + 1];

	max[node] = (a[p1] > a[p2]) ? p1 : p2;
}

int main()
{
	int n, m;

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

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

	for (int i = 0; i < n; i++)
		scanf("%d ", &a[i]);

	initialize(1, 0, n - 1);

	for (int i = 0; i < m; i++) {
		int op, x, y;
		scanf("%d %d %d\n", &op, &x, &y);

		switch (op) {
		case 0:
			printf("%d\n", a[query(1, 0, n - 1, x - 1, y - 1)]);
			break;
		case 1:
			a[x - 1] = y;
			update(1, 0, n - 1, x - 1);
			break;
		}
	}

	return 0;
}