Cod sursa(job #401692)

Utilizator hungntnktpHungntnktp hungntnktp Data 23 februarie 2010 04:05:14
Problema Gropi Scor 0
Compilator fpc Status done
Runda Arhiva de probleme Marime 2.24 kb
{DINH QUANG DAT TIN 07-10}
{GROPI}
CONST
 TFI='GROPI.IN';
 TFO='gropi.out';
 MAX=100001;
TYPE
 arr1int=array[0..MAX] of longint;
 xy=record
     x,y:longint;
    end;
VAR
 fi,fo:text;
 c,res,m,n:longint;
 a:array[0..MAX] of xy;
 d:array[0..MAX] of longint;

PROCEDURE       input;
var
 i:longint;
begin
 read(fi,c,n);
 for i:= 1 to n do
  with a[i] do read(fi,y,x);
end;

PROCEDURE       swap(var x,y:xy);
var
 tg:xy;
begin
 tg:=x;
 x:=y;
 y:=tg;
end;

PROCEDURE       sort(l,r:longint);
var
 i,j:longint;
 k:xy;
begin
 i:=l;
 j:=r;
 k:=a[(l+r) div 2];
 repeat
  while (a[i].x<k.x) or ((a[i].x=k.x) and (a[i].y<k.y)) do inc(i);
  while (a[j].x>k.x) or ((a[j].x=k.x) and (a[j].y>k.y)) do dec(j);
  if i<=j then
   begin
    if i<j then swap(a[i],a[j]);
    inc(i);
    dec(j);
   end;
 until i>j;
 if l<j then sort(l,j);
 if i<r then sort(i,r);
end;

FUNCTION        dist(a,b:xy):longint;
begin
 dist:=abs(a.x-b.x)+abs(a.y-b.y);
end;

PROCEDURE       init;
var
 i:longint;
begin
 sort(1,n);
 d[1]:=0;
 for i:= 2 to n do
  begin
   d[i]:=d[i-1]+dist(a[i],a[i-1]);
   if (a[i].x-a[i-1].x)=(a[i-1].y-a[i].y) then d[i]:=0;
  end;
end;

FUNCTION        findright(x:longint):longint;
var
 l,r,mid:longint;
begin
 findright:=-1;
 l:=1;
 r:=n;
 while l<=r do
  begin
   mid:=(l+r) div 2;
   if x<=a[mid].x then
    begin
     r:=mid-1;
     findright:=mid;
    end else l:=mid+1;
  end;
end;

FUNCTION        findleft(x:longint):longint;
var
 l,r,mid:longint;
begin
 findleft:=-1;
 l:=1;
 r:=n;
 while l<=r do
  begin
   mid:=(l+r) div 2;
   if a[mid].x<=x then
    begin
     l:=mid+1;
     findleft:=mid;
    end else r:=mid-1;
  end;
end;

PROCEDURE       process;
var
 i,l,r:longint;
 s,t,ll,rr:xy;
begin
 read(fi,m);
 for i:= 1 to m do
  begin
   read(fi,s.y,s.x,t.y,t.x);
   l:=findright(s.x);
   r:=findleft(t.x);
   if (l=-1) or (r=-1) then res:=dist(s,t)
    else
     begin
      ll:=a[l];
      ll.y:=3-ll.y;
      rr:=a[r];
      rr.y:=3-rr.y;
      res:=dist(s,ll)+dist(t,rr)+d[r]-d[l];
     end;
   writeln(fo,res+1);
  end;
end;

BEGIN
 assign(fi,tfi);reset(fi);
 assign(fo,tfo);rewrite(fo);
  input;
  init;
  process;
 close(fo);
 close(fi);
END.