Pagini recente » Cod sursa (job #478627) | Cod sursa (job #38737) | Cod sursa (job #2687123) | Cod sursa (job #1770193) | Cod sursa (job #1083535)
#include <cstdio>
#include <deque>
using namespace std;
int countt, a[1003][1003], n, m, ml_col[1003], ML_col[1003];
int solve(int L , int l)
{
int sol = 99999999;
deque<int> MM[1003], mm[1003];
for (int j = 1; j <= m; ++j)
for (int i = 1; i < l; ++i)
{
while (!MM[j].empty() && a[MM[j].back()][j] <= a[i][j])
MM[j].pop_back();
MM[j].push_back(i);
while (!mm[j].empty() && a[mm[j].back()][j] >= a[i][j])
mm[j].pop_back();
mm[j].push_back(i);
}
for (int i = l; i <= n; ++i)
{
deque<int> rez, ML, ml;
for (int j = 1; j <= m; ++j)
{
while (!MM[j].empty() && a[MM[j].back()][j] <= a[i][j])
MM[j].pop_back();
MM[j].push_back(i);
if (MM[j].front() <= i - l)
MM[j].pop_front();
while (!mm[j].empty() && a[mm[j].back()][j] >= a[i][j])
mm[j].pop_back();
mm[j].push_back(i);
if (mm[j].front() <= i - l)
mm[j].pop_front();
ml_col[j] = a[mm[j].front()][j], ML_col[j] = a[MM[j].front()][j];
while (!ML.empty() && ML_col[ML.back()] <= ML_col[j])
ML.pop_back();
ML.push_back(j);
if (ML.front() <= j - L) ML.pop_front();
while (!ml.empty() && ml_col[ml.back()] >= ml_col[j])
ml.pop_back();
ml.push_back(j);
if (ml.front() <= j - L) ml.pop_front();
if (j >= L)
{
if (ML_col[ML.front()] - ml_col[ml.front()] < sol)
sol = ML_col[ML.front()] - ml_col[ml.front()], countt = 1;
else
if (ML_col[ML.front()] - ml_col[ml.front()] == sol)
++countt;
}
}
}
return sol;
}
int main()
{
int k;
freopen("struti.in", "r", stdin);
freopen("struti.out", "w", stdout);
scanf("%d %d %d", &n, &m, &k);
for (int i = 1; i <= n; ++i)
for (int j = 1; j <= m; ++j)
scanf("%d", &a[i][j]);
for (int i = 1; i <= k; ++i)
{
int l, L, sol, nr;
scanf("%d %d", &L, &l);
sol = solve(L, l); nr = countt;
if (l != L)
{
l = solve(l, L);
if (l == sol)
nr += countt;
else
if (l < sol)
sol = l, nr = countt;
}
printf("%d %d\n", sol, nr);
}
return 0;
}