Pagini recente » Cod sursa (job #2176962) | Cod sursa (job #566899) | Cod sursa (job #3238652) | Cod sursa (job #3228858) | Cod sursa (job #2590090)
#include <fstream>
using namespace std;
ifstream in ("struti.in");
ofstream out ("struti.out");
const int VM = 1e3;
short int v [VM + 1] [VM + 1];
short int minl [VM + 1] [VM + 1], maxl [VM + 1] [VM + 1];
short int minc [VM + 1] [VM + 1], maxc [VM + 1] [VM + 1];
short int dmin [VM + 1], dmax [VM + 1];
int nl, nc, x, y;
void citeste () {
for (int i = 1; i <= nl; i ++)
for (int j = 1; j <= nc; j ++)
in >> v [i] [j];
}
void minime_linie () {
int st, dr;
for (int i = 1; i <= nl; i ++) {
st = 1; dr = 0;
for (int j = 1; j <= nc; j ++) {
if (st <= dr && j - dmin [st] == x)
st ++;
while (st <= dr && v [i] [j] <= v [i] [dmin [dr]])
dr --;
dmin [++ dr] = j;
if (j >= x)
minl [i] [j] = v [i] [dmin [st]];
}
}
}
void maxime_linie () {
int st, dr;
for (int i = 1; i <= nl; i ++) {
st = 1; dr = 0;
for (int j = 1; j <= nc; j ++) {
if (st <= dr && j - dmax [st] == x)
st ++;
while (st <= dr && v [i] [j] >= v [i] [dmax [dr]])
dr --;
dmax [++ dr] = j;
if (j >= x)
maxl [i] [j] = v [i] [dmax [st]];
}
}
}
void minime_coloana () {
int st, dr;
for (int j = x; j <= nc; j ++) {
st = 1; dr = 0;
for (int i = 1; i <= nl; i ++) {
if (st <= dr && i - dmin [st] == y)
st ++;
while (st <= dr && minl [i] [j] <= minl [dmin [dr]] [j])
dr --;
dmin [++ dr] = i;
if (i >= y)
minc [i] [j] = minl [dmin [st]] [j];
}
}
}
void maxime_coloana () {
int st, dr;
for (int j = x; j <= nc; j ++) {
st = 1; dr = 0;
for (int i = 1; i <= nl; i ++) {
if (st <= dr && i - dmax [st] == y)
st ++;
while (st <= dr && maxl [i] [j] >= maxl [dmax [dr]] [j])
dr --;
dmax [++ dr] = i;
if (i >= y)
maxc [i] [j] = maxl [dmax [st]] [j];
}
}
}
int main () {
int nt, dif, difmin, nr;
in >> nl >> nc >> nt;
citeste ();
for (int ct1 = 1; ct1 <= nt; ct1 ++) {
in >> x >> y;
difmin = 1 << 30;
for (int ct2 = 1; ct2 <= 2; ct2 ++) {
minime_linie ();
minime_coloana ();
maxime_linie ();
maxime_coloana ();
for (int i = y; i <= nl; i ++)
for (int j = x; j <= nc; j ++) {
dif = maxc [i] [j] - minc [i] [j];
if (dif < difmin) {
difmin = dif;
nr = 1;
}
else if (dif == difmin)
nr ++;
}
if (x == y)
ct2 = 3;
swap (x, y);
}
out << difmin << ' ' << nr << '\n';
}
return 0;
}