Cod sursa(job #146718)

Utilizator sima_cotizoSima Cotizo sima_cotizo Data 2 martie 2008 00:42:28
Problema Arbori de intervale Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.17 kb
#include <cstdio>
#include <algorithm>
using namespace std;

long *Arb;
long _st, _dr, _x;

void init(long x) {
	long k;
	for (k=1; k<=x; k<<=1);
	Arb = new long[k];
}

void update(long r, long st, long dr) {
	if ( _st<=st && dr<=_dr ) {
		Arb[r] = _x; return;
	}
	long mij = (st+dr)/2;
	if ( _st<=mij )
		update(2*r+1, st, mij);
	if ( mij<_dr ) 
		update(2*r+2, mij+1, dr);
	Arb[r] = max(Arb[2*r+1], Arb[2*r+2]);
}

long query(long r, long st, long dr) {
	if ( st==dr ) return Arb[r];
	if ( _st<=st && dr<=_dr )
		return Arb[r];
	long mij=(st+dr)/2, m = 0;
	if ( _st<=mij )
		m = max(m, query(2*r+1, st, mij));
	if ( mij<_dr )
		m = max(m, query(2*r+2, mij+1, dr));
	return m;
}


int main() {
	long n,m,i;

	freopen("arbint.in", "r", stdin);
	freopen("arbint.out", "w", stdout);
	scanf("%ld %ld", &n, &m);

	init(n);
	for (i=1; i<=n; ++i) {
		_st = _dr = i;
		long x;
		scanf("%ld", &x); _x = x;
		update(0, 1, n);
	}
	scanf("\n");
	while ( m-- ) {
		long x,y; char c;
		scanf("%c %ld %ld\n", &c, &x, &y);
		switch ( c ) {
			case '0':
				_st = x, _dr = y;
				printf("%ld\n", query(0,1,n));
				break;
			case '1':
				_st = x; _dr = x; _x = y;
				update(0,1,n);
				break;
		}
	}
	return 0;
}