Pagini recente » Cod sursa (job #2341320) | Cod sursa (job #3004049) | Cod sursa (job #2661324) | Cod sursa (job #2503970) | Cod sursa (job #1991911)
#include <bits/stdc++.h>
using namespace std;
const int INF = 1e9 + 69 * 69;
const int N = 1005;
int i, j, n, m, p, x, y, deq1[N], deq2[N], cnt, rs;
int a[N][N], mn[N][N], mx[N][N];
void solve(int dx, int dy) {
for(i = 1; i <= n; ++i) {
int st1 = 1, dr1 = 0, st2 = 1, dr2 = 0;
for(j = 1; j <= m; ++j) {
while(st1 <= dr1 && a[i][deq1[dr1]] >= a[i][j]) --dr1;
while(st2 <= dr2 && a[i][deq2[dr2]] <= a[i][j]) --dr2;
deq1[++dr1] = j; deq2[++dr2] = j;
if(deq1[st1] <= j - dy) ++st1;
if(deq2[st2] <= j - dy) ++st2;
if(j >= dy) {
mn[i][j] = a[i][deq1[st1]];
mx[i][j] = a[i][deq2[st2]];
}
}
}
for(j = dy; j <= m; ++j) {
int st1 = 1, dr1 = 0, st2 = 1, dr2 = 0;
for(i = 1; i <= n; ++i) {
while(st1 <= dr1 && mn[deq1[dr1]][j] >= mn[i][j]) --dr1;
while(st2 <= dr2 && mx[deq2[dr2]][j] <= mx[i][j]) --dr2;
deq1[++dr1] = i; deq2[++dr2] = i;
if(deq1[st1] <= i - dx) ++st1;
if(deq2[st2] <= i - dx) ++st2;
if(i >= dx) {
int gmb = mx[deq2[st2]][j];
int fnc = mn[deq1[st1]][j];
if(gmb - fnc == rs) ++cnt;
else if(gmb - fnc < rs) rs = gmb - fnc, cnt = 1;
}
}
}
}
int main() {
ifstream cin("struti.in");
ofstream cout("struti.out");
ios_base::sync_with_stdio(0);
cin >> n >> m >> p;
for(i = 1; i <= n; ++i)
for(j = 1; j <= m; ++j)
cin >> a[i][j];
while(p--) {
cin >> x >> y;
rs = INF; cnt = 0;
solve(x, y);
if(x != y) solve(y, x);
cout << rs << ' ' << cnt << '\n';
}
return 0;
}