Pagini recente » Cod sursa (job #2923725) | Cod sursa (job #2081285) | Cod sursa (job #1968945) | Cod sursa (job #2989372) | Cod sursa (job #754071)
Cod sursa(job #754071)
#include <cctype>
#include <fstream>
using namespace std;
char parse[10000000], *now;
int get()
{
while (!isdigit(*now)) ++now;
int number = 0;
while (isdigit(*now))
number *= 10, number += *now - '0', ++now;
return number;
}
int N, M, P;
short A[1002][1002];
short Dmin[1002][2002], b1[1002];
short Dmax[1002][2002], b2[1002];
short Rmin[2002], B1;
short Rmax[2002], B2;
int main()
{
ifstream fin("struti.in");
ofstream fout("struti.out");
fin.getline(parse, 10000000, '\0');
now = parse;
N = get();
M = get();
P = get();
for (int i = 1; i <= N; ++i)
for (int j = 1; j <= M; ++j)
A[i][j] = get();
int L1, L2;
for (int k = 1; k <= P; ++k)
{
L1 = get();
L2 = get();
int minnow = 1 << 30, total = 0;
for (int i = 1; i <= M; ++i)
{
b1[i] = 1, b2[i] = 1;
Dmin[i][0] = 0;
Dmax[i][0] = 0;
}
for (int i = 1; i <= N; ++i)
{
for (int j = 1; j <= M; ++j)
{
if (b1[j] <= Dmin[j][0] && Dmin[j][b1[j]] <= i - L1)
++b1[j];
while (b1[j] <= Dmin[j][0] && A[i][j] <= A[Dmin[j][Dmin[j][0]]][j])
--Dmin[j][0];
Dmin[j][++Dmin[j][0]] = i;
if (b2[j] <= Dmax[j][0] && Dmax[j][b2[j]] <= i - L1)
++b2[j];
while (b2[j] <= Dmax[j][0] && A[i][j] >= A[Dmax[j][Dmax[j][0]]][j])
--Dmax[j][0];
Dmax[j][++Dmax[j][0]] = i;
}
if (i < L1) continue;
Rmin[0] = 0, B1 = 1;
Rmax[0] = 0, B2 = 1;
for (int j = 1; j <= M; ++j)
{
if (B1 <= Rmin[0] && Rmin[B1] <= j - L2)
++B1;
while (B1 <= Rmin[0] && A[Dmin[j][b1[j]]][j] <= A[Dmin[Rmin[Rmin[0]]][b1[Rmin[Rmin[0]]]]][Rmin[Rmin[0]]])
--Rmin[0];
Rmin[++Rmin[0]] = j;
if (B2 <= Rmax[0] && Rmax[B2] <= j - L2)
++B2;
while (B2 <= Rmax[0] && A[Dmax[j][b2[j]]][j] >= A[Dmax[Rmax[Rmax[0]]][b2[Rmax[Rmax[0]]]]][Rmax[Rmax[0]]])
--Rmax[0];
Rmax[++Rmax[0]] = j;
if (j >= L2)
if (A[Dmax[Rmax[B2]][b2[Rmax[B2]]]][Rmax[B2]] - A[Dmin[Rmin[B1]][b1[Rmin[B1]]]][Rmin[B1]] < minnow)
{
minnow = A[Dmax[Rmax[B2]][b2[Rmax[B2]]]][Rmax[B2]] - A[Dmin[Rmin[B1]][b1[Rmin[B1]]]][Rmin[B1]];
total = 1;
}
else if (A[Dmax[Rmax[B2]][b2[Rmax[B2]]]][Rmax[B2]] - A[Dmin[Rmin[B1]][b1[Rmin[B1]]]][Rmin[B1]] == minnow)
++total;
}
}
for (int i = 1; i <= M; ++i)
{
b1[i] = 1, b2[i] = 1;
Dmin[i][0] = 0;
Dmax[i][0] = 0;
}
for (int i = 1; i <= N; ++i)
{
for (int j = 1; j <= M; ++j)
{
if (b1[j] <= Dmin[j][0] && Dmin[j][b1[j]] <= i - L2)
++b1[j];
while (b1[j] <= Dmin[j][0] && A[i][j] <= A[Dmin[j][Dmin[j][0]]][j])
--Dmin[j][0];
Dmin[j][++Dmin[j][0]] = i;
if (b2[j] <= Dmax[j][0] && Dmax[j][b2[j]] <= i - L2)
++b2[j];
while (b2[j] <= Dmax[j][0] && A[i][j] >= A[Dmax[j][Dmax[j][0]]][j])
--Dmax[j][0];
Dmax[j][++Dmax[j][0]] = i;
}
if (i < L2) continue;
Rmin[0] = 0, B1 = 1;
Rmax[0] = 0, B2 = 1;
for (int j = 1; j <= M; ++j)
{
if (B1 <= Rmin[0] && Rmin[B1] <= j - L1)
++B1;
while (B1 <= Rmin[0] && A[Dmin[j][b1[j]]][j] <= A[Dmin[Rmin[Rmin[0]]][b1[Rmin[Rmin[0]]]]][Rmin[Rmin[0]]])
--Rmin[0];
Rmin[++Rmin[0]] = j;
if (B2 <= Rmax[0] && Rmax[B2] <= j - L1)
++B2;
while (B2 <= Rmax[0] && A[Dmax[j][b2[j]]][j] >= A[Dmax[Rmax[Rmax[0]]][b2[Rmax[Rmax[0]]]]][Rmax[Rmax[0]]])
--Rmax[0];
Rmax[++Rmax[0]] = j;
if (j >= L1)
if (A[Dmax[Rmax[B2]][b2[Rmax[B2]]]][Rmax[B2]] - A[Dmin[Rmin[B1]][b1[Rmin[B1]]]][Rmin[B1]] < minnow)
{
minnow = A[Dmax[Rmax[B2]][b2[Rmax[B2]]]][Rmax[B2]] - A[Dmin[Rmin[B1]][b1[Rmin[B1]]]][Rmin[B1]];
total = 1;
}
else if (A[Dmax[Rmax[B2]][b2[Rmax[B2]]]][Rmax[B2]] - A[Dmin[Rmin[B1]][b1[Rmin[B1]]]][Rmin[B1]] == minnow)
++total;
}
}
if (L1 == L2) total /= 2;
fout << minnow << ' ' << total << '\n';
}
fin.close();
fout.close();
}