Cod sursa(job #252379)

Utilizator MihaiBunBunget Mihai MihaiBun Data 4 februarie 2009 12:36:49
Problema Struti Scor 30
Compilator fpc Status done
Runda Arhiva de probleme Marime 2.52 kb
program strutii;
var f,g:text;
    a:array[1..1000,1..1000] of integer;
    d,e:array[1..1000] of integer;
    m,n,dx,dy,i,j,minim,k,p,nr,nrmin,q,li,lf,l1,l2,x:longint;

function min(u,v:integer):integer;
var z,w:integer;
begin
   z:=8001;
   for w:=0 to dx-1 do
      if a[u+w,v]<z then z:=a[u+w,v];
   min:=z
end;

function max(u,v:integer):integer;
var z,w:integer;
begin
   z:=-1;
   for w:=0 to dx-1 do
      if a[u+w,v]>z then z:=a[u+w,v];
   max:=z
end;

begin
  assign(f,'struti.in');
  assign(g,'struti.out');
  rewrite(g);
  reset(f);
  readln(f,m,n,p);
  for i:=1 to m do
    begin
      for j:=1 to n do read(f,a[i,j]);
      readln(f)
    end;
  for k:=1 to p do
   begin
      readln(f,dx,dy);
      nrmin:=0;
      minim:=8001;
      for i:=1 to m-dx+1 do
      begin
          li:=1;lf:=0;l1:=1;l2:=0;
          for j:=1 to n do
            begin
                while (li<=lf)and(min(i,j)<=min(i,d[lf])) do lf:=lf-1;
                while (l1<=l2)and(max(i,j)>=max(i,e[l2])) do l2:=l2-1;
                lf:=lf+1;l2:=l2+1;
                d[lf]:=j;e[l2]:=j;
                if d[li]=j-dy then li:=li+1;
                if e[l1]=j-dy then l1:=l1+1;
                x:=max(i,e[l1])-min(i,d[li]);
                if j>=dy then if x<minim then begin
                                                minim:=x;
                                                nrmin:=1
                                              end
                                         else if x=minim then nrmin:=nrmin+1;
            end;
        end;
        if dx<>dy then
         begin
         q:=dx;dx:=dy;dy:=q;
         for i:=1 to m-dx+1 do
         begin
          li:=1;lf:=0;l1:=1;l2:=0;
          for j:=1 to n do
            begin
                while (li<=lf)and(min(i,j)<=min(i,d[lf])) do lf:=lf-1;
                while (l1<=l2)and(max(i,j)>=max(i,e[l2])) do l2:=l2-1;
                lf:=lf+1;l2:=l2+1;
                d[lf]:=j;e[l2]:=j;
                if d[li]=j-dy then li:=li+1;
                if e[l1]=j-dy then l1:=l1+1;
                x:=max(i,e[l1])-min(i,d[li]);
                if j>=dy then if x<minim then begin
                                                minim:=x;
                                                nrmin:=1
                                              end
                                         else if x=minim then nrmin:=nrmin+1;
            end;
         end;
        end;
       writeln(g,minim,' ',nrmin);
   end;
   close(f);
   close(g);
end.