Pagini recente » Monitorul de evaluare | Cod sursa (job #3318737) | Cod sursa (job #2649513) | Cod sursa (job #2255946) | Cod sursa (job #3356184)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("struti.in");
ofstream fout("struti.out");
int m, n, p;
int a[1005][1005];
int rmin[1005][1005], rmax[1005][1005];
int dq1[1005], dq2[1005];
int best_diff, cnt;
void solve_window(int dx, int dy) {
if (dx > m || dy > n) return;
for (int i = 1; i <= m; ++i) {
int st1 = 1, dr1 = 0;
int st2 = 1, dr2 = 0;
for (int j = 1; j <= n; ++j) {
while (st1 <= dr1 && a[i][dq1[dr1]] >= a[i][j]) dr1--;
dq1[++dr1] = j;
while (st2 <= dr2 && a[i][dq2[dr2]] <= a[i][j]) dr2--;
dq2[++dr2] = j;
while (st1 <= dr1 && dq1[st1] <= j - dy) st1++;
while (st2 <= dr2 && dq2[st2] <= j - dy) st2++;
if (j >= dy) {
rmin[i][j] = a[i][dq1[st1]];
rmax[i][j] = a[i][dq2[st2]];
}
}
}
for (int j = dy; j <= n; ++j) {
int st1 = 1, dr1 = 0;
int st2 = 1, dr2 = 0;
for (int i = 1; i <= m; ++i) {
while (st1 <= dr1 && rmin[dq1[dr1]][j] >= rmin[i][j]) dr1--;
dq1[++dr1] = i;
while (st2 <= dr2 && rmax[dq2[dr2]][j] <= rmax[i][j]) dr2--;
dq2[++dr2] = i;
while (st1 <= dr1 && dq1[st1] <= i - dx) st1++;
while (st2 <= dr2 && dq2[st2] <= i - dx) st2++;
if (i >= dx) {
int diff = rmax[dq2[st2]][j] - rmin[dq1[st1]][j];
if (diff < best_diff) {
best_diff = diff;
cnt = 1;
} else if (diff == best_diff) {
cnt++;
}
}
}
}
}
int main() {
fin >> m >> n >> p;
for (int i = 1; i <= m; ++i) {
for (int j = 1; j <= n; ++j) {
fin >> a[i][j];
}
}
for (int i = 1; i <= p; ++i) {
int dx, dy;
fin >> dx >> dy;
best_diff = 2e9;
cnt = 0;
solve_window(dx, dy);
if (dx != dy) {
solve_window(dy, dx);
}
fout << best_diff << " " << cnt << "\n";
}
fin.close();
fout.close();
return 0;
}