Cod sursa(job #1718082)

Utilizator Luncasu_VictorVictor Luncasu Luncasu_Victor Data 16 iunie 2016 16:40:26
Problema Arbori de intervale Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.4 kb
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;

int n, m, tree[300000], k=0, a[100000];

void build_tree(int l, int r, int nod) {
	if (l == r) {
		tree[nod] = a[++k];
		return;
	}
	int m = (l + r) / 2;
	build_tree(l, m, 2 * nod);
	build_tree(m + 1, r, 2 * nod + 1);
	tree[nod] = max(tree[2 * nod], tree[2 * nod + 1]);
}

void update(int l, int r, int nod, int& pos, int& val) {
	if (l == r) {
		tree[nod] = val;
		return;
	}
	int m = (l + r) / 2;
	if (pos <= m) {
		update(l, m, 2*nod, pos, val);
	}
	else {
		update(m + 1, r, 2*nod+1, pos, val);
	}
	tree[nod] = max(tree[2 * nod], tree[2 * nod + 1]);
}

void query(int l, int r, int nod, int& x, int& y, int& res) {
	if (x <= l && r <= y) {
		res = max(res, tree[nod]);
		return;
	}
	int m = (l + r) / 2;
	if (x <= m) {
		query(l, m, 2 * nod, x, y, res);
	} 
	if (y > m) {
		query(m + 1, r, 2 * nod + 1, x, y, res);
	}
}

int main(void)
{
	int op, x, y;
	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);
		a[i] = x;
	}

	build_tree(1, n, 1);

	for (int i = 1; i <= m; i++) {
		scanf("%d %d %d", &op, &x, &y);
		if (op == 0) {
			int res = 0;
			query(1, n, 1, x, y, res);
			printf("%d\n", res);
		}
		else {
			update(1, n, 1, x, y);
		}
	}
	
	cout << endl;
	return 0;
}