Cod sursa(job #293397)

Utilizator belgun_adrianBelgun Dimitri Adrian belgun_adrian Data 1 aprilie 2009 19:22:51
Problema Arbori de intervale Scor 50
Compilator fpc Status done
Runda Arhiva educationala Marime 1.3 kb
// Arhiva educationala - Arbori de intervale
var
	n, m, i, t, a, b : longint;
	v : array[1..500000] of longint;
	f, g : text;
	
function max (a, b : longint) : longint;
begin
if (a > b) then max := a else max := b;
end;

function query   (nod, st, dr, a, b : longint) : longint;
var
	maxim, mij : longint;
begin
if (a <= st) and (dr <= b) then
	begin
	query := v[nod]; exit;
	end;
mij := (st+dr) div 2; maxim := 0;
if (a <= mij) then
	maxim := max (maxim, query (2*nod, st, mij, a, b));
if (mij < b) then
	maxim := max (maxim, query (2*nod+1, mij+1, dr, a, b));
query := maxim;
end;

procedure update (nod, st, dr, poz, val : longint);
var
    mij : longint;
begin
if (st = poz) and (dr = poz) then
	begin v[nod] := val; exit; end;
mij := (st + dr) div 2;
if (poz <= mij) then
	update (2*nod, st, mij, poz, val);
if (mij < poz) then
	update (2*nod+1, mij+1, dr, poz, val);
v[nod] := max (v[2*nod], v[2*nod+1]);
end;

begin
assign	(f, 'arbint.in');	assign 	(g, 'arbint.out');
reset	(f);				rewrite	(g);
readln	(f, n, m);
for i := 1 to n do
	begin
	read 	(f, a);
	update	(1, 1, n, i, a);
	end;
readln	(f);
for i := 1 to m do
	begin
	readln	(f, t, a, b);
	if (t = 1) then
		update	(1, 1, n, a, b)
	else
		writeln	(g, query (1, 1, n, a, b));
	end;
close	(f);				close	(g);
end.