Pagini recente » Cod sursa (job #2227054) | Cod sursa (job #2681726) | Cod sursa (job #1724262) | Cod sursa (job #1948818) | Cod sursa (job #2793336)
#include <fstream>
#include <queue>
#include <string>
std::ifstream fin("struti.in");
std::ofstream fout("struti.out");
const int nmax = 1000, mmax = 1000, xmax = 8000;
int v[nmax+1][mmax+1], vmin[mmax+1][nmax+1], vmax[mmax+1][nmax+1];
int main( ) {
int n, m, t;
fin >> n >> m >> t;
for ( int i = 1; i <= n; ++ i ) {
for ( int j = 1; j <= m ; ++ j ) {
fin >> v[i][j];
}
}
for ( int ti = 1; ti <= t; ++ ti ) {
int x, y;
fin >> x >> y;
int sol = xmax, sol2 = 0, i2;
if ( x != y ) {
i2 = 0;
} else {
i2 = 1;
}
while ( i2 < 2 ) {
for ( int i = 1; i <= n; ++ i ) {
std::deque <int> dmin, dmax;
for ( int j = 1; j <= m; ++ j ) {
while ( dmin.empty() == 0 && v[i][dmin.back()] > v[i][j] ) {
dmin.pop_back();
}
dmin.push_back(j);
if ( dmin.front() <= j-y ) {
dmin.pop_front();
}
vmin[j][i] = v[i][dmin.front()];
while ( dmax.empty() == 0 && v[i][dmax.back()] < v[i][j] ) {
dmax.pop_back();
}
dmax.push_back(j);
if ( dmax.front() <= j-y ) {
dmax.pop_front();
}
vmax[j][i] = v[i][dmax.front()];
}
}
for ( int j = y; j <= m; ++ j ) {
std::deque <int> dmin, dmax;
for ( int i = 1; i <= n; ++ i ) {
while ( dmin.empty() == 0 && vmin[j][dmin.back()] > vmin[j][i] ) {
dmin.pop_back();
}
dmin.push_back(i);
if ( dmin.front() <= i-x ) {
dmin.pop_front();
}
while ( dmax.empty() == 0 && vmax[j][dmax.back()] < vmax[j][i] ) {
dmax.pop_back();
}
dmax.push_back(i);
if ( dmax.front() <= i-x ) {
dmax.pop_front();
}
if ( i >= x ) {
int aux = vmax[j][dmax.front()]-vmin[j][dmin.front()];
if ( sol > aux ) {
sol = aux;
sol2 = 1;
} else if ( sol == aux ) {
++ sol2;
}
}
}
}
++i2;
int aux = x;
x = y;
y = aux;
}
fout << sol << " " << sol2 << "\n";
}
return 0;
}