Cod sursa(job #810468)

Utilizator toranagahVlad Badelita toranagah Data 10 noiembrie 2012 13:03:39
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.43 kb
#include <fstream>
#include <algorithm>
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
const int MAX_N = 100100;
int v[MAX_N];
int segTree[MAX_N * 5];
void build(int nod, int lo, int hi);
void update(int nod, int lo, int hi, int a, int b);
int query(int nod, int lo, int hi, int a, int b);
int N, M;

int main() {
	fin >> N >> M;
	for (int i = 1; i <= N; ++i) {
		fin >> v[i];
	}
	build(1, 1, N);

	int act, a, b;
	for (int i = 1; i <= M; ++i) {
		fin >> act >> a >> b;
		if (act == 0) {
			fout << query(1, 1, N, a, b) << '\n';
		} else {
			update(1, 1, N, a, b);
		}
	}
	return 0;
}

void build(int nod, int lo, int hi) {
	if (lo == hi) {
		segTree[nod] = v[lo];
	} else {
		int mid = lo + (hi - lo) / 2;
		build(nod * 2, lo, mid);
		build(nod * 2 + 1, mid + 1, hi);
		segTree[nod] = max(segTree[nod * 2], segTree[nod * 2 + 1]);
	}
}

void update(int nod, int lo, int hi, int a, int b) {
	if (lo == hi) {
		segTree[nod] = b; 
	} else {
		int mid = lo + (hi - lo) / 2;
		if (a <= mid) {
			update(nod * 2, lo, mid, a, b);
		} else {
			update(nod * 2 + 1, mid + 1, hi, a, b);
		}
		segTree[nod] = max(segTree[nod * 2], segTree[nod * 2 + 1]);
	}
}

int query(int nod, int lo, int hi, int a, int b) {
	if (a <= lo && b >= hi) {
		return segTree[nod];
	}
	int q1 = 0, q2 = 0;
	int mid = lo + (hi - lo) / 2;
	if (a <= mid) q1 = query(nod * 2, lo, mid, a, b);
	if (b > mid) q2 = query(nod * 2 + 1, mid + 1, hi, a, b);
	return max(q1, q2);
}