Pagini recente » Cod sursa (job #267940) | Cod sursa (job #404345) | Cod sursa (job #2428569) | Cod sursa (job #676546) | Cod sursa (job #286220)
Cod sursa(job #286220)
#include <cstdio>
#include <deque>
using namespace std;
const int N = 1000;
const int M = 1000;
int n,m,p;
int a[N][M];
void scan ( int dx, int dy, int &min, int &nr ) {
min = 0x3f3f3f3f;
nr = 0;
deque<int> dmin[M],dmax[M], dlmin, dlmax;
for (int i = 0; i < n; ++i) {
dlmin.clear();
dlmax.clear();
for (int j = 0; j < m; ++j) {
if (!dmin[j].empty() && dmin[j].front() == i-dx) dmin[j].pop_front();
while (!dmin[j].empty() && a[dmin[j].back()][j] > a[i][j]) dmin[j].pop_back();
dmin[j].push_back(i);
if (!dmax[j].empty() && dmax[j].front() == i-dx) dmax[j].pop_front();
while (!dmax[j].empty() && a[dmax[j].back()][j] < a[i][j]) dmax[j].pop_back();
dmax[j].push_back(i);
if (!dlmin.empty() && dlmin.front() == j-dy) dlmin.pop_front();
while (!dlmin.empty() && a[dmin[dlmin.back()].front()][dlmin.back()] > a[dmin[j].front()][j]) dlmin.pop_back();
dlmin.push_back(j);
if (!dlmax.empty() && dlmax.front() == j-dy) dlmax.pop_front();
while (!dlmax.empty() && a[dmax[dlmax.back()].front()][dlmax.back()] < a[dmax[j].front()][j]) dlmax.pop_back();
dlmax.push_back(j);
if (i >= dx-1 && j >= dy-1) {
int r = a[dmax[dlmax.front()].front()][dlmax.front()] - a[dmin[dlmin.front()].front()][dlmin.front()];
if (r < min) min = r, nr = 1; else
if (r == min) ++nr;
}
}
}
}
int main() {
freopen("struti.in","rt",stdin);
freopen("struti.out","wt",stdout);
scanf("%d %d %d",&n,&m,&p);
for (int i = 0; i < n; ++i) {
for (int j = 0; j < m; ++j) {
scanf("%d",&a[i][j]);
}
}
for (int k = 0, dx, dy; k < p; ++k) {
scanf("%d %d",&dx,&dy);
int min1,n1,min2,n2;
scan(dx,dy,min1,n1);
scan(dx,dy,min2,n2);
if (min1 == min2 && dx != dy) n1 += n2; else
if (min2 < min1) min1 = min2, n1 = n2;
printf("%d %d\n",min1,n1);
}
return 0;
}