Cod sursa(job #2069970)

Utilizator SlevySlevoaca Stefan-Gabriel Slevy Data 19 noiembrie 2017 00:57:08
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.25 kb
#include <iostream>
#include <fstream>
#include <algorithm>
#define NMAX 100001

using namespace std;

int AINT[4 * NMAX + 10];

void update(int node, int left, int right, int pos, int val) {

	if (left == right)
		AINT[node] = val;
	else {
		
		int mid = left + (right - left) / 2;

		if (pos <= mid)
			update(2 * node, left, mid, pos, val);
		if (pos > mid)
			update(2 * node + 1, mid + 1, right, pos, val);

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

int query(int node, int left, int right, int x, int y) {

	if (x <= left && right <= y)
		return AINT[node];
	else {

		int mid = left + (right - left) / 2;
		int val1 = -1, val2 = -1;
		if (x <= mid)
			val1 = query(2 * node, left, mid, x, y);
		if (mid < y)
			val2 = query(2 * node + 1, mid + 1, right, x, y);

		return max(val1, val2);
	}
}

int main() {

	int n, m, x, code, y;

	ifstream in("arbint.in");
	ofstream out("arbint.out");

	in >> n >> m;
	for (int i = 1; i <= n; ++i) {

		in >> x;
		update(1, 1, n, i, x);
	}
	
	for (int i = 1; i <= m; ++i) {

		in >> code >> x >> y;
		if (code == 0)
			out << query(1, 1, n, x, y) << "\n";
		else if (code == 1)
			update(1, 1, n, x, y);
	}

	in.close();
	out.close();
	return 0;
}