Pagini recente » Cod sursa (job #1713539) | Cod sursa (job #2699343) | Cod sursa (job #2390592) | Cod sursa (job #3210110) | Cod sursa (job #1597369)
#include <bits/stdc++.h>
using namespace std;
const int bsize = (1 << 20);
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;
char buffer[bsize] , bpos;
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 readint()
{
int x = 0;
while (!('0' <= buffer[bpos] && buffer[bpos] <= '9'))
{
bpos++;
if (bpos == bsize) fread(buffer , 1 , bsize , stdin);
}
while ('0' <= buffer[bpos] && buffer[bpos] <= '9')
{
x = 10 * x + buffer[bpos] - '0';
bpos++;
if (bpos == bsize) fread(buffer , 1 , bsize , stdin);
}
return x;
}
int main()
{
freopen("struti.in" , "r" , stdin);
freopen("struti.out" , "w" , stdout);
fread(buffer , 1 , bsize , stdin);
n = readint();
m = readint();
p = readint();
for (i = 1 ; i <= n ; ++i)
for (j = 1 ; j <= m ; ++j)
a[i][j] = readint();
for (i = 1 ; i <= p ; ++i)
{
dx = readint();
dy = readint();
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;
}