Cod sursa(job #808659)

Utilizator ahmed.abdraboahmed.abdrabo ahmed.abdrabo Data 7 noiembrie 2012 06:06:28
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.13 kb
#include <cstdio>
#include <algorithm>

using namespace std;

inline int next_int() {
	int d;
	scanf("%d", &d);
	return d;
}

const int H = 17;
int Tree[2 << 17];

int q(int root, int left, int right, int a, int b) {
	if (left == a && b == right)
		return Tree[root];
	int mid = (left + right) >> 1;
	if (b <= mid)
		return q(root << 1, left, mid, a, b);
	if (mid <= a)
		return q(root << 1 | 1, mid, right, a, b);
	return max(q(root << 1, left, mid, a, mid), q(root << 1 | 1, mid, right, mid, b));
}

int query(int a, int b) {
	return q(1, 1 << H, 2 << H, (1 << H) + a, (1 << H) + b);
}

void set(int index, int value) {
	index += 1 << H;
	Tree[index] = value;
	while (index >= 2) {
		index >>= 1;
		Tree[index] = max(Tree[index << 1], Tree[index << 1 | 1]);
	}
}

int main() {
	freopen("arbint.in", "r", stdin);
	freopen("arbint.out", "w", stdout);
	int n = next_int();
	int m = next_int();
	for (int i = 0; i < n; i++) {
		set(i, next_int());
	}
	for (int i = 0; i < m; i++) {
		int a = next_int();
		int b = next_int();
		int c = next_int();
		if (a == 0) {
			printf("%d\n", query(b - 1, c));
		}
		if (a == 1) {
			set(b - 1, c);
		}
	}
	return 0;
}