Cod sursa(job #152978)

Utilizator andrei.12Andrei Parvu andrei.12 Data 9 martie 2008 22:52:50
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.99 kb
#include<stdio.h>
#include<algorithm>

using namespace std;

#define lg 100005

int n, m, i, a, b, mn, init[lg], q[3*lg], tip;
void cstr(int st, int dr, int poz){
	if (st == dr){
		init[st] = poz;
		return ;
	}

	int x = (st+dr) / 2;

	cstr(st, x, 2*poz);
	cstr(x+1, dr, 2*poz+1);
}
void update(int poz, int val){
	int x = init[poz];
	q[x] = val, x /= 2;

	while (x){
		q[x] = max(q[2*x], q[2*x+1]);

		x /= 2;
	}
}
void query(int st, int dr, int poz){
	if (st > b || dr < a)
		return ;

	if (st >= a && dr <= b)
		mn = max(mn, q[poz]);
	else
		if (st < dr){
			int x = (st+dr) / 2;

			query(st, x, 2*poz);
			query(x+1, dr, 2*poz+1);
		}
}
int main()
{
	freopen("arbint.in", "rt", stdin);
	freopen("arbint.out", "wt", stdout);

	scanf("%d%d", &n, &m);

	cstr(1, n, 1);
	for (i = 1; i <= n; i ++){
		scanf("%d", &a);

		update(i, a);
	}

	for (i = 1; i <= m; i ++){
		scanf("%d%d%d", &tip, &a, &b);
		
		if (!tip){
			mn = 0;

			query(1, n, 1);

			printf("%d\n", mn);
		}
		else
			update(a, b);
	}

	return 0;
}