Cod sursa(job #347540)

Utilizator ionutz32Ilie Ionut ionutz32 Data 12 septembrie 2009 17:35:01
Problema Struti Scor 100
Compilator fpc Status done
Runda Arhiva de probleme Marime 2.66 kb
var a,max,max2,min,min2:array[1..1000,1..1000] of word;
dq1,dq2:array[1..1000] of word;
m,n,p,i,j,k,x,y,st1,dr1,st2,dr2,nr,dmax,aux:longint;
f,g:text;
procedure calc;
          begin
          for j:=1 to n do
              begin
              st1:=1;st2:=1;dr1:=0;dr2:=0;
              for k:=1 to m do
                  begin
                  while (st1<=dr1) and (a[k,j]>=a[dq1[dr1],j]) do
                        dec(dr1);
                  inc(dr1);
                  dq1[dr1]:=k;
                  while (st2<=dr2) and (a[k,j]<=a[dq2[dr2],j]) do
                        dec(dr2);
                  inc(dr2);
                  dq2[dr2]:=k;
                  if k>=x then
                     begin
                     max[k,j]:=a[dq1[st1],j];
                     min[k,j]:=a[dq2[st2],j];
                     if dq1[st1]=k-x+1 then
                        inc(st1);
                     if dq2[st2]=k-x+1 then
                        inc(st2);
                     end;
                  end;
              end;
          for j:=x to m do
              begin
              st1:=1;st2:=1;dr1:=0;dr2:=0;
              for k:=1 to n do
                  begin
                  while (st1<=dr1) and (max[j,k]>=max[j,dq1[dr1]]) do
                        dec(dr1);
                  inc(dr1);
                  dq1[dr1]:=k;
                  while (st2<=dr2) and (min[j,k]<=min[j,dq2[dr2]]) do
                        dec(dr2);
                  inc(dr2);
                  dq2[dr2]:=k;
                  if k>=y then
                     begin
                     max2[j,k]:=max[j,dq1[st1]];
                     min2[j,k]:=min[j,dq2[st2]];
                     if max2[j,k]-min2[j,k]<dmax then
                        begin
                        dmax:=max2[j,k]-min2[j,k];
                        nr:=1;
                        end
                     else
                         if max2[j,k]-min2[j,k]=dmax then
                            inc(nr);
                     if dq1[st1]=k-y+1 then
                        inc(st1);
                     if dq2[st2]=k-y+1 then
                        inc(st2);
                     end;
                  end;
              end;
          end;
begin
assign(f,'struti.in');
assign(g,'struti.out');
reset(f);rewrite(g);
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 i:=1 to p do
    begin
    readln(f,x,y);
    nr:=0;dmax:=maxlongint;
    calc;
    if x<>y then
       begin
       aux:=x;
       x:=y;
       y:=aux;
       calc;
       end;
    writeln(g,dmax,' ',nr);
    end;
close(f);close(g);
end.