Cod sursa(job #1076232)

Utilizator dunhillLotus Plant dunhill Data 9 ianuarie 2014 23:15:49
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.17 kb
#include <algorithm>
#include <fstream>
using namespace std;

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

#define nmax 100001
#define L (node << 1)
#define R (L | 1)

int H[nmax * 3];
int v[nmax];

inline void update(int node, int l, int r, int p, int v) {
	if (l == r){H[node] = v; return;}
	int m = (l + r) >> 1;
	if (p <= m) update(L, l, m, p, v);
	else 
		update(R, m + 1, r, p, v);
	H[node] = max(H[L], H[R]);
}

inline int query(int node, int l, int r, int i, int j) {
	if (i <= l && r <= j) return H[node];
	int m = (l + r) >> 1;
	int sol = 0;
	if (i <= m)
		sol = max(sol, query(L, l, m, i, j));
	if (j > m)
		sol = max(sol, query(R, m + 1, r, i, j));
	return sol;
}

inline void build(int node, int l, int r) {
	if (l == r){H[node] = v[l]; return;}
	int m = (l + r) >> 1;
	build(L, l, m);
	build(R, m + 1, r);
	H[node] = max(H[L], H[R]);
}

int i, n, m;
int op, a, b;

int main() {
	fin >> n >> m;
	for (i = 1; i <= n; ++i) fin >> v[i];
	build(1, 1, n);
	for (i = 1; i <= m; ++i) {
		fin >> op >> a >> b;
		if (op == 0) 
			fout << query(1, 1, n, a, b) << '\n';
		if (op == 1) 
			update(1, 1, n, a, b);
	}
	return 0;
}