Pagini recente » Cod sursa (job #2275626) | Cod sursa (job #1307127) | Cod sursa (job #359458) | Cod sursa (job #2859521) | Cod sursa (job #949688)
Cod sursa(job #949688)
#include <cstdio>
#include <cstdlib>
#include <algorithm>
using namespace std;
#define Nmax 1010
#define PI pair<int, int>
#define mp make_pair
#define Inf 0x3f3f3f3f
int N, M, X, Y, P, Min[Nmax][Nmax], Max[Nmax][Nmax];
int Dmin[Nmax], Dmax[Nmax], frontMin, frontMax, backMin, backMax;
int A[Nmax][Nmax];
PI Find(int X, int Y)
{
int NowMin = Inf, Freq = 0;
for(int j = 1; j <= M; ++ j)
{
frontMin = frontMax = 1;
backMin = backMax = 0;
for(int i = 1; i <= N; ++ i)
{
while(frontMin <= backMin && A[Dmin[backMin]][j] > A[i][j]) backMin --;
while(frontMax <= backMax && A[Dmax[backMax]][j] < A[i][j]) backMax --;
Dmin[++ backMin] = i;
Dmax[++ backMax] = i;
if(i - X == Dmin[frontMin]) frontMin ++;
if(i - X == Dmax[frontMax]) frontMax ++;
Min[i][j] = A[Dmin[frontMin]][j];
Max[i][j] = A[Dmax[frontMax]][j];
}
}
for(int i = X; i <= N; ++ i)
{
frontMin = frontMax = 1;
backMin = backMax = 0;
for(int j = 1; j <= M; ++ j)
{
while(frontMin <= backMin && Min[i][Dmin[backMin]] > Min[i][j]) backMin --;
while(frontMax <= backMax && Max[i][Dmax[backMax]] < Max[i][j]) backMax --;
Dmin[++backMin] = j;
Dmax[++backMax] = j;
if(j - Y == Dmin[frontMin]) frontMin ++;
if(j - Y == Dmax[frontMax]) frontMax ++;
if(j >= Y)
{
int Now = Max[i][Dmax[frontMax]] - Min[i][Dmin[frontMin]];
if(NowMin > Now) NowMin = Now, Freq = 1;
else if(NowMin == Now) Freq ++;
}
}
}
return mp(NowMin, Freq);
}
PI GetAns(int X, int Y)
{
PI First = Find(X, Y), Second = Find(Y, X);
if(First.first == Second.first && X != Y) return mp(First.first, First.second + Second.second);
return min(First, Second);
}
int main()
{
freopen("struti.in", "r", stdin);
freopen("struti.out", "w", stdout);
int i, j;
scanf("%i %i %i", &N, &M, &P);
for(i = 1; i <= N; ++ i)
for(j = 1; j <= M; ++ j)
scanf("%i", &A[i][j]);
for(i = 1; i <= P; ++ i)
{
scanf("%i %i", &X, &Y);
PI Ans = GetAns(X, Y);
printf("%i %i\n", Ans.first, Ans.second);
}
return 0;
}