Pagini recente » Cod sursa (job #2066546) | Cod sursa (job #588879) | Cod sursa (job #1245341) | Cod sursa (job #2893887) | Cod sursa (job #1994566)
#include <fstream>
using namespace std;
ofstream fout ("struti.out");
class InputReader {
public:
InputReader() {}
InputReader(const char *name) {
fin = fopen(name, "r");
buffpos = Size - 1;
}
inline InputReader &operator >>(short int &n) {
char ch = nextpos();
while(ch < '0' || ch > '9') {
ch = nextpos();
}
n = 0;
while('0' <= ch && ch <= '9') {
n = n * 10 + ch - '0';
ch = nextpos();
}
return *this;
}
private:
FILE *fin;
static const int Size = 1 << 17;
int buffpos;
char buff[Size];
inline char nextpos() {
++ buffpos;
if(buffpos == Size) {
buffpos = 0;
fread(buff, Size, 1, fin);
}
return buff[ buffpos ];
}
} fin ("struti.in");
typedef short int i16;
const int nmax = 1000 + 5;
const int inf = 1 << 30;
const pair<int, int> gol = make_pair(1, 0);
i16 n, m;
i16 v[nmax + 1][nmax + 1];
i16 mncol[nmax + 1][nmax + 1], mxcol[nmax + 1][nmax + 1];
pair<i16, i16> mx[nmax + 1], mn[nmax + 1];
void baga_minim (pair<i16, i16> d[nmax + 1], i16 val, i16 pos, i16 lg) {
while (d[ 0 ].first <= d[ 0 ].second && d[ d[ 0 ].second ].first >= val) {
-- d[ 0 ].second;
}
d[ ++ d[ 0 ].second ] = make_pair(val, pos);
if (d[ d[ 0 ].first ].second <= pos - lg) {
++ d[ 0 ].first;
}
}
void baga_maxim (pair<i16, i16> d[nmax + 1], i16 val, i16 pos, i16 lg) {
while (d[ 0 ].first <= d[ 0 ].second && d[ d[ 0 ].second ].first <= val) {
-- d[ 0 ].second;
}
d[ ++ d[ 0 ].second ] = make_pair(val, pos);
if (d[ d[ 0 ].first ].second <= pos - lg) {
++ d[ 0 ].first;
}
}
pair<int, int> solve (i16 x, i16 y) {
for (int j = 1; j <= m; ++ j) {
mn[ 0 ] = mx[ 0 ] = gol;
for (int i = 1; i <= n; ++ i) {
baga_minim(mn, v[ i ][ j ], i, x);
baga_maxim(mx, v[ i ][ j ], i, x);
mncol[ i ][ j ] = mn[ mn[ 0 ].first ].first;
mxcol[ i ][ j ] = mx[ mx[ 0 ].first ].first;
}
}
int sol, cate;
sol = inf; cate = 0;
for (int i = x; i <= n; ++ i) {
mn[ 0 ] = mx[ 0 ] = gol;
for (int j = 1; j <= m; ++ j) {
baga_minim(mn, mncol[ i ][ j ], j, y);
baga_maxim(mx, mxcol[ i ][ j ], j, y);
if (y <= j) {
int dif = mx[ mx[ 0 ].first ].first - mn[ mn[ 0 ].first ].first;
if (dif < sol) {
sol = dif; cate = 0;
}
cate += (dif == sol);
}
}
}
return make_pair(sol, cate);
}
int main() {
i16 q;
fin >> n >> m >> q;
for (int i = 1; i <= n; ++ i) {
for (int j = 1; j <= m; ++ j) {
fin >> v[ i ][ j ];
}
}
while (q --) {
i16 x, y;
fin >> x >> y;
pair<int, int> ans1 = solve(x, y);
if (x != y) {
pair<int, int> ans2 = solve(y, x);
if (ans1.first == ans2.first) {
ans1.second += ans2.second;
} else if (ans1.first > ans2.first) {
ans1 = ans2;
}
}
fout << ans1.first << " " << ans1.second << "\n";
}
fout.close();
return 0;
}