Pagini recente » Cod sursa (job #1581435) | Cod sursa (job #1256960) | Cod sursa (job #716617) | Cod sursa (job #2073729) | Cod sursa (job #2674769)
#include <iostream>
#include <cstdio>
#include <deque>
using namespace std;
struct poz {
int i, j;
poz(int _i = 0, int _j = 0) : i(_i), j(_j) {}
};
const int NMAX = 1000;
const int DIFMAX = 8000;
int n, m, p;
int a[NMAX + 5][NMAX + 5];
deque<int> col_min[NMAX + 5], col_max[NMAX + 5];
deque<poz> crt_min, crt_max;
void solve(int dx, int dy, int &min_dif, int &nrap) {
for(int j = 1; j <= m; ++j) {
col_min[j].clear();
col_max[j].clear();
}
min_dif = DIFMAX + 5;
nrap = 0;
for(int i = 1; i <= n; ++i) {
if(i >= dx) {
crt_min.clear();
crt_max.clear();
}
for(int j = 1; j <= m; ++j) {
if(!col_min[j].empty() && col_min[j].front() == i - dx) col_min[j].pop_front();
while(!col_min[j].empty() && a[i][j] <= a[col_min[j].back()][j]) col_min[j].pop_back();
col_min[j].emplace_back(i);
int minim = col_min[j].front();
if(!col_max[j].empty() && col_max[j].front() == i - dx) col_max[j].pop_front();
while(!col_max[j].empty() && a[col_max[j].back()][j] <= a[i][j]) col_max[j].pop_back();
col_max[j].emplace_back(i);
int maxim = col_max[j].front();
if(i >= dx) {
if(!crt_min.empty() && crt_min.front().j == j - dy) crt_min.pop_front();
while(!crt_min.empty() && a[crt_min.back().i][crt_min.back().j] >= a[minim][j]) crt_min.pop_back();
crt_min.emplace_back(minim, j);
if(!crt_max.empty() && crt_max.front().j == j - dy) crt_max.pop_front();
while(!crt_max.empty() && a[crt_max.back().i][crt_max.back().j] <= a[maxim][j]) crt_max.pop_back();
crt_max.emplace_back(maxim, j);
}
if(i >= dx && j >= dy) {
minim = a[crt_min.front().i][crt_min.front().j];
maxim = a[crt_max.front().i][crt_max.front().j];
if(maxim - minim == min_dif) nrap++;
else if(maxim - minim < min_dif) {
min_dif = maxim - minim;
nrap = 1;
}
}
}
}
}
int main() {
freopen("struti.in", "r", stdin);
freopen("struti.out", "w", stdout);
scanf("%d %d %d", &n, &m, &p);
for(int i = 1; i <= n; ++i)
for(int j = 1; j <= m; ++j)
scanf("%d", &a[i][j]);
int l1, l2, dif1, dif2;
int n1, n2;
while(p--) {
scanf("%d", &l1);
scanf("%d", &l2);
dif1 = dif2 = DIFMAX + 5;
n1 = n2 = 0;
solve(l1, l2, dif1, n1);
if(l2 != l1)
solve(l2, l1, dif2, n2);
if(dif1 == dif2)
printf("%d %d\n", dif1, n1 + n2);
else
printf("%d %d\n", (dif1 < dif2) ? dif1 : dif2, (dif1 < dif2) ? n1 : n2);
}
return 0;
}