Pagini recente » Cod sursa (job #2401289) | Cod sursa (job #738847) | Cod sursa (job #1147589) | Cod sursa (job #1855871) | Cod sursa (job #721124)
Cod sursa(job #721124)
const val=131072;
//cea mai mica putere a lui 2 mai mare decat (n<=100000)
//aleasa astfel incat arborele de intervale sa fie echilibrat
var v:array[0..2*val] of longint;
//numarul de frunze este egal cu jumatate din numarul de noduri
i, j, n, m, max:longint;
x, y, z, p:longint;
f, g:text;
buf1, buf2:array [1.. 1 shl 17] of char;
function maxim (fx, fy:longint):longint; begin if fx>fy then maxim:= fx else maxim:= fy; end;
procedure update (fp, fx:longint); //pune elementul fx in pozitia fp
begin
v[fp]:=fx;
fp:=fp div 2;
while fp<>0 do //merge pana la radacina (fp=1 -> radacina)
begin
v[fp]:=maxim (v[fp*2], v[fp*2+1]); //update nod, maximul dintre fii
fp:=fp div 2;
end;
end;
procedure cauta (s, d, niv:longint); //s, d capetele intervalului, niv - pozitia in vector
var mij:longint;
begin
mij:=(s+d) div 2;
if ((x<=s) and (d<=y)) then
begin
if v[niv]>max then max :=v[niv]; //conditia de oprire, daca subintervalul pe care suntem
end //este parte a intervalului cautat
else
begin
if x<=mij then cauta (s, mij, 2*niv); //conditia de cautare in subintervalul stanga
if mij+1<=y then cauta (mij+1, d, 2*niv+1); //conditia de cautare in subintervalul dreapta
end;
end;
begin
assign (f, 'arbint.in'); settextbuf (f, buf1); reset (f);
assign (g, 'arbint.out'); settextbuf (g, buf2); rewrite (g);
read (f, n, m);
for i:= 1 to n do
begin
read (f, x);
update (val+i-1, x);
end;
for i:= 1 to m do
begin
read (f, z, x, y);
if z=1 then update (val+x-1, y);
if z=0 then
begin
max:=0;
cauta (1, val, 1);
writeln (g, max);
end;
end;
close (f); close (g);
end.