Cod sursa(job #2151341)

Utilizator filipbFilip Cristian Buruiana filipb Data 4 martie 2018 13:11:49
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.1 kb
#include <cstdio>
#include <algorithm>

#define NMAX 100001

using namespace std;

int N, M;
int v[NMAX], A[(NMAX << 1) + 1];

inline int get(int node) {
	return node <= 2 * N + 1 ? A[node] : 0;
}

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

	A[node] = max(get(node*2), get(node*2+1));
}

int query(int node, int l, int r, int a, int b) {
	if (a <= l && r <= b) {
		return A[node];
	}
	
	int m = (l + r) / 2;
	int q1 = 0, q2 = 0;
	if (a <= m) {
		q1 = query(node * 2, l, m, a, b);
	}
	if (b > m) {
		q2 = query(node * 2 + 1, m+1, r, a, b);
	}
	return max(q1, q2);
}

int main() {
	int t, i, j, x;

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

	scanf("%d %d", &N, &M);
	for (i = 1; i <= N; i++) {
		scanf("%d", &x);
		update(1, 1, N, i, x);
	}
	for (; M; M--) {
		scanf("%d %d %d", &t, &i, &j);
		if (t == 0) {
			printf("%d\n", query(1, 1, N, i, j));
		} else {
			update(1, 1, N, i, j);
		}
	}

	return 0;
}