Cod sursa(job #1234987)

Utilizator yololy97Olaru Bogdan-Ioan yololy97 Data 28 septembrie 2014 14:58:07
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.22 kb
#include <cstdio>
#include <algorithm>
#define N 100001
using namespace std;
int H[3 * N], v[N], n, m;
void build(int node, int L, int R){
	int M = (L + R) / 2;
	if(L == R)
		H[node] = v[L];
	else{
		build(node * 2, L, M);
		build(node * 2 + 1, M + 1, R);
		H[node] = max(H[node * 2], H[node * 2 + 1]);
	}
}
void update(int node, int L, int R, int pos, int val){
	int M = (L + R) / 2;
	if(L == R)
		H[node] = val;
	else{
		if(pos <= M)
			update(node * 2, L, M, pos, val);
		else
			update(node * 2 + 1, M + 1, R, pos, val);
		H[node] = max(H[node * 2], H[node * 2 + 1]);
	}
}
int query(int node, int L, int R, int ql, int qr){
	if(ql <= L && qr >= R)
		return H[node];
	int M = (L + R) / 2, maxi = 0;
	if(ql <= M)
		maxi = max(query(node * 2, L, M, ql, qr), maxi);
	if(qr > M)
		maxi = max(query(node * 2 + 1, M + 1, R, ql, qr), maxi);
	return maxi;
}
int main(){
	freopen("arbint.in", "r", stdin);
	freopen("arbint.out", "w", stdout);
	scanf("%d %d ", &n, &m);
	for(int i = 1; i <= n; ++i)
		scanf("%d ", &v[i]);
	build(1, 1, n);
	for(int i = 1; i <= m; ++i){
		int ok, a, b;
		scanf("%d %d %d", &ok, &a, &b);
		if(ok)
			update(1, 1, n, a, b);
		else
			printf("%d\n", query(1, 1, n, a, b));
	}
}