Pagini recente » Cod sursa (job #62026) | Cod sursa (job #1263729) | Cod sursa (job #2406101) | Cod sursa (job #1772729) | Cod sursa (job #1597355)
#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()
{
ifstream fin("struti.in");
ofstream fout("struti.out");
fin >> n >> m >> p;
for (i = 1 ; i <= n ; ++i)
for (j = 1 ; j <= m ; ++j)
fin >> a[i][j];
for (i = 1 ; i <= p ; ++i)
{
fin >> dx >> dy;
fa = solve(dx , dy);
if (dx == dy)
{
fout << fa.first << " " << fa.second << '\n';
continue;
}
sa = solve(dy , dx);
if (fa.first == sa.first) fa.second += sa.second;
if (fa.first > sa.first) fa = sa;
fout << fa.first << " " << fa.second << '\n';
}
return 0;
}