Pagini recente » Cod sursa (job #3174265) | Cod sursa (job #2340280) | Cod sursa (job #2466901) | Cod sursa (job #2692441) | Cod sursa (job #1597349)
#include <bits/stdc++.h>
using namespace std;
deque < int > mn , mx;
int a[1009][1009] , cmn[1009][1009] , cmx[1009][1009];
int n , m , dx , dy , result , i , j , p;
pair < int , int > fa , sa;
pair < int , int > solve(int dx , int dy)
{
int i , j , result , pos , c0;
for (i = 1 ; i <= m ; ++i)
{
while (mn.size()) mn.pop_back();
while (mx.size()) mx.pop_back();
for (j = 1 ; j <= n ; ++j)
{
if (mn.front() <= j - dx) mn.pop_front();
if (mx.front() <= j - dx) mx.pop_front();
while (mn.size() && a[mn.back()][i] >= a[j][i]) mn.pop_back();
while (mx.size() && a[mx.back()][i] <= a[j][i]) mx.pop_back();
mn.push_back(j);
mx.push_back(j);
cmn[j][i] = a[mn.front()][i];
cmx[j][i] = a[mx.front()][i];
}
}
result = 8009; pos = 0;
for (i = dx ; i <= n ; ++i)
{
while (mn.size()) mn.pop_back();
while (mx.size()) mx.pop_back();
for (j = 1 ; j <= m ; ++j)
{
if (mn.front() <= j - dy) mn.pop_front();
if (mx.front() <= j - dy) mx.pop_front();
while (mn.size() && cmn[i][mn.back()] >= cmn[i][j]) mn.pop_back();
while (mx.size() && cmx[i][mx.back()] <= cmx[i][j]) mx.pop_back();
mn.push_back(j);
mx.push_back(j);
if (j >= dy)
{
c0 = cmx[i][mx.front()] - cmn[i][mn.front()];
if (c0 < result) result = c0 , pos = 0;
if (c0 == result) pos++;
}
}
}
return make_pair(result , pos);
}
int main()
{
freopen("struti.in" , "r" , stdin);
freopen("struti.out" , "w" , stdout);
scanf("%d" , &n);
scanf("%d" , &m);
scanf("%d" , &p);
for (i = 1 ; i <= n ; ++i)
for (j = 1 ; j <= m ; ++j)
scanf("%d" , &a[i][j]);
for (i = 1 ; i <= p ; ++i)
{
scanf("%d" , &dx);
scanf("%d" , &dy);
fa = solve(dx , dy);
if (dx == dy)
{
printf("%d %d\n" , fa.first , fa.second);
continue;
}
sa = solve(dy , dx);
if (fa.first == sa.first) fa.second += sa.second;
if (fa.first > sa.first) fa = sa;
printf("%d %d\n" , fa.first , fa.second);
}
return 0;
}