Pagini recente » Cod sursa (job #416754) | Cod sursa (job #10861) | Cod sursa (job #1582296) | Cod sursa (job #434261) | Cod sursa (job #1218279)
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <iostream>
#include <iomanip>
#include <string>
#include <vector>
#include <bitset>
#include <stack>
#include <queue>
#include <list>
#include <map>
#include <set>
using namespace std;
#define INFL "struti.in"
#define OUTFL "struti.out"
#define INF 0x3f3f3f3f
#define nmax 1001
#define lmax 10
int m, n, p;
int A[nmax][nmax];
deque<int> qMin[nmax], qMax[nmax], q, qq;
void read() {
scanf("%d%d%d", &m, &n, &p);
for(int i=1; i<=m; ++i)
for(int j=1; j<=n; ++j)
scanf("%d", &A[i][j]);
}
int _solve(int x, int y, int &cnt) {
int ans = INF, diff;
cnt = 0;
for(int i=1; i<=m; ++i) {
for(int j=1; j<=n; ++j) {
while(!qMin[j].empty() && i - qMin[j].front() >= x)
qMin[j].pop_front();
while(!qMin[j].empty() && A[i][j] <= A[qMin[j].back()][j])
qMin[j].pop_back();
qMin[j].push_back(i);
while(!qMax[j].empty() && i - qMax[j].front() >= x)
qMax[j].pop_front();
while(!qMax[j].empty() && A[i][j] >= A[qMax[j].back()][j])
qMax[j].pop_back();
qMax[j].push_back(i);
}
if(i >= x) {
for(int j=1; j<=n; ++j) {
while(!q.empty() && j - q.front() >= y)
q.pop_front();
while(!q.empty() && A[qMin[j].front()][j] <= A[qMin[q.back()].front()][q.back()])
q.pop_back();
q.push_back(j);
while(!qq.empty() && j - qq.front() >= y)
qq.pop_front();
while(!qq.empty() && A[qMax[j].front()][j] >= A[qMax[qq.back()].front()][qq.back()])
qq.pop_back();
qq.push_back(j);
if(j >= y) {
diff = A[qMax[qq.front()].front()][qq.front()] - A[qMin[q.front()].front()][q.front()];
if(diff < ans) {
ans = diff;
cnt = 1;
}
else if(diff == ans) {
++cnt;
}
}
}
q.clear();
qq.clear();
}
}
for(int i=1; i<=m; ++i) {
qMin[i].clear();
qMax[i].clear();
}
return ans;
}
void solve() {
int dx, dy, ans, cnt, c, aux;
for(int i=1; i<=p; ++i) {
scanf("%d%d", &dx, &dy);
if(dx <= m && dy <= n) {
ans = _solve(dx, dy, c);
cnt = c;
}
if(dx != dy && dy <= m && dx <= n) {
aux = _solve(dy, dx, c);
if(aux < ans) {
ans = aux;
cnt = c;
}
else if(aux == ans)
cnt += c;
}
printf("%d %d\n", ans, cnt);
}
}
int main() {
//#define ONLINE_JUDGE 1
#ifndef ONLINE_JUDGE
freopen(INFL, "r", stdin);
freopen(OUTFL, "w", stdout);
#endif
read();
solve();
return 0;
}