Cod sursa(job #27421)

Utilizator fogabFodor Gabor fogab Data 6 martie 2007 13:59:36
Problema Ograzi Scor 40
Compilator fpc Status done
Runda Arhiva de probleme Marime 2.14 kb
const max=1001;
      T=(sqrt(5)-1)/2;
type  pe=^e;
      e=record
        me:word;
        next:pe;
       end;
var f:text;
    b:array[0..max,0..max] of pe;
    a:array[1..2,0..50000] of longint;
    first:array[0..max,0..max] of byte;
    n,m,w,h,i,sol,x,y,x2,y2:longint;
    go,go2:pe;
begin
sol:=0;
assign(f,'ograzi.in');
reset(f);
readln(f,n,m,w,h);
for i:=1 to n do
  begin
  readln(f,a[1,i],a[2,i]);
  x2:=(a[1,i] div w)+1;
  x:=trunc(max*frac(x2*T))+1;
  x2:=(a[2,i] div h)+1;
  y:=trunc(max*frac(x2*T))+1;
  if first[x,y]=0 then begin
                       first[x,y]:=1;
                       new(b[x,y]);
                       b[x,y]^.next:=nil;
                       b[x,y]^.me:=i;
                       end
  else begin
  go:=b[x,y];
  while go^.next<>nil do go:=go^.next;
  new(go2);
  go2^.next:=nil;
  go2^.me:=i;
  go^.next:=go2;
  end;
  end;
a[1,0]:=-2147483646;
a[2,0]:=-2147483646;
for i:=1 to m do
  begin
    readln(f,x,y);
    x2:=trunc(max*frac(((x div w)+1)*T))+1;
    y2:=trunc(max*frac(((y div h)+1)*T))+1;
    go:=b[x2,y2];
    while go<>nil do begin
    if (a[1,go^.me]<=x) and (a[1,go^.me]+w>=x)
    and (a[2,go^.me]<=y) and (a[2,go^.me]+h>=y) then inc(sol);
    go:=go^.next;
    end;
    x2:=trunc(max*frac(((x div w))*T))+1;
    y2:=trunc(max*frac(((y div h)+1)*T))+1;
    go:=b[x2,y2];
    while go<>nil do begin
    if (a[1,go^.me]<=x) and (a[1,go^.me]+w>=x)
    and (a[2,go^.me]<=y) and (a[2,go^.me]+h>=y) then inc(sol);
    go:=go^.next;
    end;
    x2:=trunc(max*frac(((x div w))*T))+1;
    y2:=trunc(max*frac(((y div h))*T))+1;
    go:=b[x2,y2];
    while go<>nil do begin
    if (a[1,go^.me]<=x) and (a[1,go^.me]+w>=x)
    and (a[2,go^.me]<=y) and (a[2,go^.me]+h>=y) then inc(sol);
    go:=go^.next;
    end;
    x2:=trunc(max*frac(((x div w)+1)*T))+1;
    y2:=trunc(max*frac(((y div h))*T))+1;
    go:=b[x2,y2];
    while go<>nil do begin
    if (a[1,go^.me]<=x) and (a[1,go^.me]+w>=x)
    and (a[2,go^.me]<=y) and (a[2,go^.me]+h>=y) then inc(sol);
    go:=go^.next;
    end;
  end;
close(f);
assign(f,'ograzi.out');
rewrite(f);
writeln(f,sol);
close(f);
end.