Cod sursa(job #401807)

Utilizator hungntnktpHungntnktp hungntnktp Data 23 februarie 2010 09:32:14
Problema Gropi Scor 100
Compilator fpc Status done
Runda Arhiva de probleme Marime 2.56 kb
uses  math;
const tfi='gropi.in';
      tfo='gropi.out';
      maxn=100100;
var   fi,fo:text;
      test,cc,n,m:longint;
      res:int64;
      x,y:array[0..maxn] of longint;
      x1,x2,y1,y2:longint;
      f:array[0..maxn] of longint;

procedure swap(var u,v:longint);
var   tg:longint;
begin
      tg:=u; u:=v; v:=tg;
end;

procedure sort(l,r:longint);
var   mid,midy,i,j:longint;
begin
      if l>=r then exit;
      i:=l; j:=r;
      mid:=y[(l+r) div 2];
      repeat
            while y[i]<mid do inc(i);
            while y[j]>mid do dec(j);
            if i<=j then
             begin
                  swap(x[i],x[j]);
                  swap(y[i],y[j]);
                  inc(i); dec(j);
             end;
      until i>j;
      sort(i,r); sort(l,j);
end;

function findl(u,v:longint):longint;
var   l,r,mid,tg:longint;
begin
      l:=1; r:=m;
      tg:=0;
      while l<=r do
       begin
            mid:=(L+R) DIV 2;
            if y[mid]<=v then
             begin
                  tg:=max(tg,mid);
                  l:=mid+1;
             end
            else r:=mid-1;
       end;
      exit(tg);
end;

function findr(u,v:longint):longint;
var   l,r,mid,tg:longint;
begin
      l:=1; r:=m;
      tg:=m+1;
      while l<=r do
       begin
            mid:=(L+R) DIV 2;
            if y[mid]>=v then
             begin
                  tg:=min(tg,mid);
                  r:=mid-1;
             end
            else l:=mid+1;
       end;
      exit(tg);
end;

function dist(u,v,u1,v1:longint):longint;
begin
  exit(abs(u-u1)+abs(v-v1));
end;

procedure enter;
var   i:longint;
begin
      read(Fi,cc,m);
      for i:=1 to m do read(fi,x[i],y[i]);
end;

procedure tinh;
var   r1,r2,l1,l2,i:longint;
begin
      f[1]:=dist(1,1,3-x[1],y[1]);
      for i:=2 to m do
       f[i]:=f[i-1]+dist(3-x[i-1],y[i-1],3-x[i],y[i]);
      read(fi,test);
      for i:=1 to test do
       begin
            read(fi,x1,y1,x2,y2);
            if y1>y2 then
             begin
              swap(y1,y2); swap(x1,x2);
             end;
            l1:=findl(x1,y1);
            l2:=findl(x2,y2);
            r1:=findr(x1,y1);
            if l1=l2 then res:=dist(x1,y1,x2,y2)
            else
             begin
              res:=dist(x1,y1,3-x[r1],y[r1])+dist(3-x[l2],y[l2],x2,y2);
              res:=res+f[l2]-f[r1];
             end;
            writeln(fo,res+1);
       end;
end;

begin
  assign(fi,tfi); reset(fi);
  assign(Fo,tfo); rewrite(fo);
  enter;
  sort(1,m);
  tinh;
  close(Fi); close(Fo);
end.