Pagini recente » Cod sursa (job #1075525) | Cod sursa (job #2280346) | Cod sursa (job #2619945) | Cod sursa (job #19957) | Cod sursa (job #2762589)
#include <fstream>
#include <queue>
#include <string>
using namespace std;
ifstream fin("struti.in");
ofstream fout("struti.out");
const int nmax = 1000, mmax = 1000, xmax = 8000;
int v[nmax+1][mmax+1];
deque <int> dmin[mmax+1], dmax[mmax+1];
deque <int> dmin2, dmax2;
string::iterator fi;
void read( int &x ) { //non-negative only
while ( *fi < '0' || *fi > '9' ) {
++ fi;
}
x = 0;
while ( *fi >= '0' && *fi <= '9' ) {
x = x*10+(*fi)-'0';
++ fi;
}
}
int main( ) {
string f;
getline(fin, f, char(0));
fi = f.begin();
int n, m, t;
read(n); read(m); read(t);
for ( int i = 1; i <= n; ++ i ) {
for ( int j = 1; j <= m ; ++ j ) {
read(v[i][j]);
}
}
for ( int ti = 1; ti <= t; ++ ti ) {
int x, y;
read(x); read(y);
int sol = xmax, sol2 = 0, ie;
if ( x != y ) {
ie = 0;
} else {
ie = 1;
}
while ( ie < 2 ) {
for ( int j = 1; j <= m; ++ j ) {
dmin[j].resize(0);
dmax[j].resize(0);
}
for ( int i = 1; i <= n; ++ i ) {
dmin2.resize(0);
dmax2.resize(0);
for ( int j = 1; j <= m; ++ j) {
while ( dmin[j].empty() == 0 && v[dmin[j].back()][j] > v[i][j] ) {
dmin[j].pop_back();
}
dmin[j].push_back(i);
if ( dmin[j].front() <= i-x ) {
dmin[j].pop_front();
}
while ( dmax[j].empty() == 0 && v[dmax[j].back()][j] < v[i][j] ) {
dmax[j].pop_back();
}
dmax[j].push_back(i);
if ( dmax[j].front() <= i-x ) {
dmax[j].pop_front();
}
if ( i >= x ) {
while ( dmin2.empty() == 0 && v[dmin[dmin2.back()].front()][dmin2.back()] > v[dmin[j].front()][j] ) {
dmin2.pop_back();
}
dmin2.push_back(j);
if ( dmin2.front() <= j-y ) {
dmin2.pop_front();
}
while ( dmax2.empty() == 0 && v[dmax[dmax2.back()].front()][dmax2.back()] < v[dmax[j].front()][j] ) {
dmax2.pop_back();
}
dmax2.push_back(j);
if ( dmax2.front() <= j-y ) {
dmax2.pop_front();
}
if ( j >= y ) {
int vmin = v[dmin[dmin2.front()].front()][dmin2.front()];
int vmax = v[dmax[dmax2.front()].front()][dmax2.front()];
if ( vmax-vmin < sol ) {
sol = vmax-vmin;
sol2 = 1;
} else if ( vmax-vmin == sol ) {
++ sol2;
}
}
}
}
}
++ie;
int aux = x;
x = y;
y = aux;
}
fout << sol << " " << sol2 << "\n";
}
return 0;
}