Cod sursa(job #7307)

Utilizator mipsPavel Mircea mips Data 21 ianuarie 2007 13:23:52
Problema Radiatie Scor 0
Compilator fpc Status done
Runda preONI 2007, Runda 1, Clasele 11-12 Marime 2.65 kb
const max=30000;
type lsi=^nod;
     nod= record m,inf:longint;
                 urm:lsi;
                 end;
     tunel=record x,y,l:longint;
           end;
var tunele:array[0..max] of tunel;
    maxime:array[1..max] of lsi;
    multime:array[1..max] of longint;
    n,m,k,i,j,maux,nri:longint;p,q:lsi;
    pcte,lungimi,indici:array[1..max] of longint;
    arb:array[1..max] of record x,y,max:longint;
                         end;
                         maximm,a,b:longint;
function maxim(vf,x,y:longint):longint;
var m1,m2:longint;
begin
if x>y then
begin
maxim:=-maxint;
exit;
end;
if (x<=arb[vf].x)and (arb[vf].y<=y) then
begin
maxim:=arb[vf].max
end
else
begin

m1:=maxim(vf*2,x,arb[vf*2].y);

m2:=maxim(vf*2+1,arb[vf*2+1].x,y);

maxim:=m1*ord(m2<m1)+m2*ord(m2>=m1);
end;
end;
procedure conarb(vf,x,y:longint);
begin
inc(nri);
arb[vf].x:=x;
arb[vf].y:=y;
if x<>y then
begin
conarb(vf*2,x,(x+y) div 2);
conarb(vf*2+1,(x+y) div 2+1,y);
end
end;
procedure Quicksort(var A: array of tunel; l, r: longint);
var
  i, j: longint;
    v: Byte;help:tunel;
    begin
v := A[(l + r) div 2].l;
i := l; j := r;
repeat
while A[i].l < v do inc(i);
while v < A[j].l do dec(j);
if i <= j then begin
Help := A[i]; A[i] := A[j]; A[j] := Help;
inc(i); dec(j);
end;
until i > j;
if l < j then Quicksort(A, l, j);
if i < r then Quicksort(A, i, r);
end;
procedure add(var cap:lsi;el:longint);
var p:lsi;
begin
new(p);
p^.inf:=el;
cap^.urm:=p;
cap:=p;
end;
begin
assign(input,'radiatie.in');
reset(input);
readln(n,m,k);
for i:=1 to m do
readln(tunele[i].x,tunele[i].y,tunele[i].l);
quicksort(tunele,1,m);
for i:=1 to n do
begin
multime[i]:=i;
add(maxime[i],i);
end;
for i:=1 to m do
if multime[tunele[i].x]<>multime[tunele[i].y] then
begin
p:=maxime[multime[tunele[i].y]];
maux:=multime[tunele[i].y];
while p<>nil do
begin
multime[p^.inf]:=multime[tunele[i].x];
if p^.urm=nil then q:=p;
p:=p^.urm;
end;
q^.urm:=maxime[multime[tunele[i].x]];
q^.m:=tunele[i].l;
maxime[multime[tunele[i].x]]:=maxime[maux];
end;
p:=maxime[multime[1]];
i:=0;
while p<>nil do
begin
inc(i);
pcte[i]:=p^.inf;
lungimi[i]:=p^.m;
indici[p^.inf]:=i;
p:=p^.urm;
end;
conarb(1,1,n-1);
for i:=nri downto 1 do
if arb[i].x=arb[i].y then
begin
arb[i].max:=lungimi[arb[i].x];
end
else
begin
arb[i].max:=arb[2*i].max*ord(arb[2*i].max>arb[2*i+1].max)+arb[2*i+1].max*ord(arb[2*i].max<=arb[2*i+1].max);
end;
assign(output,'radiatie.out');
rewrite(output);
for i:=1 to k do
begin
readln(a,b);
a:=indici[a];
b:=indici[b];
if a>b then
begin
a:=a xor b;
b:=a xor b;
a:=a xor b;
end;
writeln(maxim(1,a,b-1));
end;
close(output)
end.