Pagini recente » Cod sursa (job #1508008) | Cod sursa (job #1527404) | Cod sursa (job #2264682) | Cod sursa (job #2971637) | Cod sursa (job #1076889)
#include <fstream>
#define NMAX 1002
using namespace std;
int a[NMAX][NMAX];
int minim[NMAX][NMAX];
int maxim[NMAX][NMAX];
int n, m, p, dif, nr;
ifstream in("struti.in");
ofstream out("struti.out");
void read() {
in>>n>>m>>p;
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
in>>a[i][j];
}
}
}
void solve(int dx, int dy) {
int dmin[NMAX];
int dmax[NMAX];
int stMin, stMax, drMin, drMax;
for (int i = 0; i < n; i++) {
stMin = stMax = 0;
drMin = drMax = -1;
for (int j = 0; j < m; j++) {
if (j - dmin[stMin] == dx)
stMin++;
while (stMin <= drMin && a[i][j] <= a[i][dmin[drMin]])
drMin--;
dmin[++drMin] = j;
if (j >= dx - 1) {
minim[i][j] = a[i][dmin[stMin]];
}
if (j - dmax[stMax] == dx)
stMax++;
while (stMax <= drMax && a[i][j] >= a[i][dmax[drMax]])
drMax--;
dmax[++drMax] = j;
if (j >= dx - 1) {
maxim[i][j] = a[i][dmax[stMax]];
}
}
}
for (int j = dx - 1; j < m; j++) {
stMin = stMax = 0;
drMin = drMax = -1;
for (int i = 0; i < n; i++) {
if (i - dmin[stMin] == dy)
stMin++;
while (stMin <= drMin && minim[i][j] <= minim[dmin[drMin]][j])
drMin--;
dmin[++drMin] = i;
if (i - dmax[stMax] == dy)
stMax++;
while (stMax<=drMax && maxim[i][j] >= maxim[dmax[drMax]][j])
drMax--;
dmax[++drMax] = i;
if (i >= dy - 1) {
if (dif > maxim[dmax[stMax]][j] - minim[dmin[stMin]][j]) {
dif = maxim[dmax[stMax]][j] - minim[dmin[stMin]][j];
nr = 1;
} else {
if (dif == maxim[dmax[stMax]][j] - minim[dmin[stMin]][j])
nr++;
}
}
}
}
}
int main() {
int dx,dy;
read();
for (int i = 1; i <= p; i++) {
in>>dx>>dy;
dif = 8000;
nr = 0;
solve(dx,dy);
if (dx != dy)
solve(dy, dx);
out<<dif<<" " <<nr<<"\n";
}
return 0;
}