Cod sursa(job #347540)
Utilizator | 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.