Pagini recente » Cod sursa (job #1121164) | Cod sursa (job #1544580) | Cod sursa (job #2297168) | Cod sursa (job #2083642) | Cod sursa (job #1208302)
#include <iostream>
#include <fstream>
using namespace std;
int lg[1001];
int mint[10][10][1001][1001];
int maxt[10][10][1001][1001];
int main()
{
ifstream cin("struti.in");
ofstream cout("struti.out");
int m, n, p, x, y;
cin >> m >> n >> p;
for(int i = 2; i <= 1000; ++i)
lg[i] = lg[i/2] + 1;
for(int i = 1; i <= m; ++i)
for(int j = 1; j <= n; ++j) {
cin >> maxt[0][0][i][j];
mint[0][0][i][j] = maxt[0][0][i][j];
}
for(int j = 1; (1 << j) <= n; ++j)
for(int k = 1; k <= m; ++k)
for(int i = 1; i <= n - (1 << j) + 1; ++i) {
mint[0][j][k][i] = min(mint[0][j - 1][k][i], mint[0][j - 1][k][i + (1 << (j - 1))]);
maxt[0][j][k][i] = max(maxt[0][j - 1][k][i], maxt[0][j - 1][k][i + (1 << (j - 1))]);
}
for(int j = 1; (1 << j) <= n; ++j)
for(int i = 1; i <= n; ++i)
for(int k = 1; k <= m - (1 << j) + 1; ++k) {
mint[j][0][k][i] = min(mint[j - 1][0][k][i], mint[j - 1][0][k + (1 << (j - 1))][i]);
maxt[j][0][k][i] = max(maxt[j - 1][0][k][i], maxt[j - 1][0][k + (1 << (j - 1))][i]);
}
//pana aici e bine
for(int lx = 1; (1 << lx) <= m; ++lx)
for(int ly = 1; (1 << ly) <= n; ++ly)
for(x = 1; x <= m - (1 << lx) + 1; ++x)
for(y = 1; y <= n - (1 << ly) + 1; ++y) {
mint[lx][ly][x][y] = min(min(mint[lx - 1][ly][x][y], mint[lx][ly - 1][x][y]), mint[lx - 1][ly - 1][x + (1 << (lx - 1))][y + (1 << (ly - 1))]);
maxt[lx][ly][x][y] = max(max(maxt[lx - 1][ly][x][y], maxt[lx][ly - 1][x][y]), maxt[lx - 1][ly - 1][x + (1 << (lx - 1))][y + (1 << (ly - 1))]);
}
// si aico
for(int i = 1; i <= p; ++i) {
cin >> x >> y;
int l1 = lg[x], l2 = lg[y];
int nr = 0, dmin = 8000;
for(int a = 1; a <= m; ++a)
for(int b = 1; b <= n; ++b) {
if(a + x - 1 <= m && b + y - 1 <= n) {
int ch1 = max(max(maxt[l1][l2][a][b], maxt[l1][l2][a + x - (1 << l1)][b]), max(maxt[l1][l2][a][b + y - (1 << l2)], maxt[l1][l2][a + x - (1 << l1)][b + y - (1 << l2)])) - min(min(mint[l1][l2][a][b], mint[l1][l2][a + x - (1 << l1)][b]), min(mint[l1][l2][a][b + y - (1 << l2)], mint[l1][l2][a + x - (1 << l1)][b + y - (1 << l2)]));
if(ch1 < dmin) {
nr = 1;
dmin = ch1;
}
else if(ch1 == dmin) ++nr;
}
if(a + y - 1 <= m && b + x - 1 <= n && x != y) {
int ch2 = max(max(maxt[l2][l1][a][b], maxt[l2][l1][a + y - (1 << l2)][b]), max(maxt[l2][l1][a][b + x - (1 << l1)], maxt[l2][l1][a + y - (1 << l2)][b + x - (1 << l1)])) - min(min(mint[l2][l1][a][b], mint[l2][l1][a + y - (1 << l2)][b]), min(mint[l2][l1][a][b + x - (1 << l1)], mint[l2][l1][a + y - (1 << l2)][b + x - (1 << l1)]));
if(ch2 < dmin) {
nr = 1;
dmin = ch2;
}
else if(ch2 == dmin) ++nr;
}
}
cout << dmin << ' ' << nr << '\n';
}
return 0;
}