Cod sursa(job #2650958)

Utilizator akumariaPatrascanu Andra-Maria akumaria Data 21 septembrie 2020 00:15:01
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.08 kb
#include <cstdio>

using namespace std;

int arb[400004];

int max(int a, int b) {
	return a >= b ? a:b;
}


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

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


int query(int node, int l, int r, int a, int b) {
	if (a <=l && b >= r)
		return arb[node];

	int m = ( l + r) / 2;
	int current = -1;
	if (a<=m)
		current = query(2 * node, l, m, a, b);
	if (m<b)
		current = max(current, query(2*node + 1, m + 1, r, a, b));
    return current;
}


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

	int n, m, a, b, inst;
	scanf("%d%d", &n, &m);
	for(int i=1; i<=n; ++i) {
		scanf("%d", &inst);
		update(1, 1, n, inst, i);
	}

	for(int i=0; i<m; ++i) {
		scanf("%d%d%d", &inst, &a, &b);

		if(inst == 0)
			printf("%d\n", query(1, 1, n, a, b));
		else
			update(1, 1, n, b, a);

	}

	return 0;
}