Cod sursa(job #1418927)

Utilizator phobosJustin Lim Kai Ze phobos Data 14 aprilie 2015 13:40:40
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.25 kb
#include <cstdio>
#include <cmath>
#include <algorithm>
using namespace std;
const int MX = 4*1e5+1;
int n, m, A[MX], st[MX];

void build(int node, int b, int e) {
	if (b == e) {
		st[node] = A[b];
		return;
	}
	build(2*node, b, (b+e)/2);
	build(2*node+1, (b+e)/2+1, e);
	st[node] = max(st[2*node], st[2*node+1]);
}

void update(int node, int b, int e, int i, int j, int val) {
	if (i > e || j < b) return;
	if (b == e) {
		st[node] = val;
		return;
	}
	
	update(2*node, b, (b+e)/2, i, j, val);
	update(2*node+1, (b+e)/2+1, e, i, j, val);
	st[node] = max(st[2*node], st[2*node+1]);
}

int query(int node, int b, int e, int i, int j) {
	if (i > e || j < b) return -1;
	if (i <= b && e <= j) return st[node];
	
	int x, y;
	x = query(2*node, b, (b+e)/2, i, j);
	y = query(2*node+1, (b+e)/2+1, e, i, j);
	return max(x, y);
}

int main() {
	freopen ("arbint.in", "r", stdin);
	freopen ("arbint.out", "w", stdout);
	scanf ("%d %d", &n, &m);
	for (int i = 0; i < n; i++) {
		scanf ("%d", &A[i]);
	}
	build(1, 0, n-1);
	int x, y, z;
	for (int i = 0; i < m; i++) {
		scanf("%d %d %d", &x, &y, &z);
		if (x == 0) {
			printf("%d\n", query(1, 0, n-1, y-1, z-1));
		}
		else {
			update(1, 0, n-1, y-1, y-1, z);
		}
	}
	return 0;
}