Cod sursa(job #1420743)

Utilizator gabi.cristacheGabi Cristache gabi.cristache Data 18 aprilie 2015 21:36:30
Problema Arbori de intervale Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.24 kb
#include <vector>
#include <fstream>
#include <iostream>

#define MaxN 100010
#define MaxM 100010

using namespace std;

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

int aib[MaxN * 2 + 5000];
int N, M;
int maxV;

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

void update(int node, int left, int right, int pos, int value) {
	if (left == right) {
		aib[node] = value;
		return;
	}

	int middle = left + (right - left) / 2;
	if (pos <= middle)
		update(2 * node, left, middle, pos, value);
	else
		update(2 * node + 1, middle + 1, right, pos, value);

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

void query(int node, int left, int right, int start, int end) {
	if (start <= left && right <= end) {
		maxV = max(maxV, aib[node]);
		return;
	}

	int mid = left + (right - left) / 2;
	if (start <= mid)
		query(node * 2, left, mid, start, end);
	if (mid < end)
		query(node * 2 + 1, mid + 1, right, start, end);

}

int main() {
	fin >> N >> M;

	for (int i = 1; i <= N; ++i) {
		int v;
		fin >> v;
		update(1, 1, N, i, v);
	}

	int op, a, b;
	
	for (int i = 1; i <= M; ++i) {
		fin >> op >> a >> b;

		if (op == 0) {
			maxV = 1 << 31;
			query(1, 1, N, a, b);
			fout << maxV << '\n';
		} else {
			update(1, 1, N, a, b);
		}
	}

	return 0;
}