Pagini recente » Cod sursa (job #1230443) | Cod sursa (job #1312531) | Cod sursa (job #748742) | Cod sursa (job #1154195) | Cod sursa (job #1156085)
#include <deque>
#include <fstream>
#include <string>
using namespace std;
ifstream fin("struti.in");
ofstream fout("struti.out");
const int nmax= 1000;
const int hmax= 8000;
deque <int> dmin, dmax;
int v[nmax+1][nmax+1], d[2][nmax+1][nmax+1]; //0 min, 1 max
int n, m, sol, solnr;
string buffer;
string::iterator buffer_it;
void read_int_nn( int &x ) {
for ( ; *buffer_it<'0' || *buffer_it>'9'; ++buffer_it ) ;
for ( x= 0; *buffer_it>='0' && *buffer_it<='9'; ++buffer_it ) {
x= x*10+*buffer_it-'0';
}
}
void query( int x, int y ) {
for ( int i= 1; i<=n; dmin.clear(), dmax.clear(), ++i ) {
for ( int j= 1; j<=m; ++j ) {
for ( ; !dmin.empty() && v[i][dmin.back()]>=v[i][j]; dmin.pop_back() ) ;
for ( ; !dmin.empty() && dmin.front()<=j-y; dmin.pop_front() ) ;
dmin.push_back( j );
for ( ; !dmax.empty() && v[i][dmax.back()]<=v[i][j]; dmax.pop_back() ) ;
for ( ; !dmax.empty() && dmax.front()<=j-y; dmax.pop_front() ) ;
dmax.push_back( j );
if ( j>=y ) {
d[0][i][j]= v[i][dmin.front()], d[1][i][j]= v[i][dmax.front()];
}
}
}
for ( int i= y; i<=m; dmin.clear(), dmax.clear(), ++i ) {
for ( int j= 1; j<=n; ++j ) {
for ( ; !dmin.empty() && d[0][dmin.back()][i]>=d[0][j][i]; dmin.pop_back() ) ;
for ( ; !dmin.empty() && dmin.front()<=j-x; dmin.pop_front() ) ;
dmin.push_back( j );
for ( ; !dmax.empty() && d[1][dmax.back()][i]<=d[1][j][i]; dmax.pop_back() ) ;
for ( ; !dmax.empty() && dmax.front()<=j-x; dmax.pop_front() ) ;
dmax.push_back( j );
if ( j>=x ) {
int value= d[1][dmax.front()][i]-d[0][dmin.front()][i];
if ( value<sol ) {
sol= value, solnr= 1;
} else if ( value==sol ) {
++solnr;
}
}
}
}
}
int main( ) {
getline( fin, buffer, (char)0 );
buffer_it= buffer.begin();
int p;
read_int_nn(n), read_int_nn(m), read_int_nn(p);
for ( int i= 1; i<=n; ++i ) {
for ( int j= 1; j<=m; ++j ) {
read_int_nn(v[i][j]);
}
}
for ( int i= 1, x, y; i<=p; ++i ) {
read_int_nn(x), read_int_nn(y);
sol= hmax, solnr= 0;
query(x, y);
if ( x!=y ) {
query(y, x);
}
fout<<sol<<" "<<solnr<<"\n";
}
return 0;
}