Cod sursa(job #591471)

Utilizator deneoAdrian Craciun deneo Data 24 mai 2011 12:29:17
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.04 kb
#include<cstdio>
#include<algorithm>
using namespace std;

int a[500000], n, m;

void update(int node, int left, int right, int i, int v) {
	if(left >= right) { a[node] = v; return; }
	
	int mid = (left + right) / 2;
	if(i <= mid) update(node * 2, left, mid, i, v);
	else update(node * 2 + 1, mid + 1, right, i, v);
	a[node] = max(a[node * 2], a[2 * node + 1]);
}

int query(int node, int left, int right, int st, int fn) {
	if(st <= left && right <= fn) return a[node];
	int mid = (left + right) / 2, sol = 0;
	if(st <= mid) sol = max(sol, query(node * 2, left, mid, st, fn));
	if(fn > mid) sol = max(sol, query(node * 2 + 1, mid + 1, right, st, fn));
	return sol;
}


int main() { 
	int i, st, fn, t;
	freopen("arbint.in", "r", stdin);
	freopen("arbint.out", "w", stdout);
	scanf("%d%d", &n, &m);
	for(i = 1; i <= n; ++i) {
		scanf("%d", &t);
		update(1, 1, n, i, t);
	}
	while(m--) { 
		scanf("%d%d%d", &t, &st, &fn);
		if(t == 0)
			printf("%d\n", query(1, 1, n, st, fn));
		else update(1, 1, n, st, fn);
	}
	return 0;
}