Cod sursa(job #937940)

Utilizator antonioteoZait Teodor Antonio antonioteo Data 11 aprilie 2013 13:15:39
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.19 kb
#include <fstream>
#define MAX_N 100004
#define common_up m = (l + r) / 2, L = n << 1, R = L | 1
using namespace std;
const char iname[] = "arbint.in";
const char oname[] = "arbint.out";
ifstream fin(iname);
ofstream fout(oname);
int N, M, i, j, a, b, op;
int H[3 * MAX_N];
int v[MAX_N];
inline void update (int n, int l, int r, int p, int v){
	if (l == r){H[n] = v; return;}
	int common_up;
	if (p <= m) update (L, l, m, p, v);
	else
		update (R, m + 1, r, p, v);
	H[n] = max(H[L], H[R]);
}
inline int query (int n, int l, int r, int i, int j){
	if (i <= l && r <= j) return H[n];
	int m = (l + r) / 2; int sol = 0;
	if (i <= m) sol = max(sol, query(2 * n, l, m, i, j));
	if (j > m) sol = max(sol, query(2 * n + 1, m + 1, r, i, j));
	return sol;
}
void build (int n, int l, int r){
	if (l == r){H[n] = v[l]; return;}
	int common_up;
	build (L, l, m);
	build (R, m + 1, r);
	H[n] = max(H[R], H[L]);
}
int main()
{
	fin >> N >> M;
	for (i = 1; i <= N; ++i) fin >> v[i];
	build (1, 1, N);
	while(M--)
	{
		fin >> op;
		if (op){
			fin >> a >> b;
			update (1, 1, N, a, b);
		}
		else 
		{
			fin >> a >> b;
			fout << query (1, 1, N, a, b) << '\n';
		}
	}
	return 0;
}