Cod sursa(job #591446)

Utilizator deneoAdrian Craciun deneo Data 24 mai 2011 10:52:20
Problema Arbori de intervale Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.32 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], v);
}

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

inline int query(int node, int left, int right, int i, int j)
{
    if(i<=left && right<=j) return a[node];
    int middle=(left+right)/2, sol=0;
    if(i<=middle) sol=max(sol,query(2*node, left, middle, i,j));
    if(j>middle) sol=max(sol,query(2*node+1, middle+1,right, i, j));
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;
}