Pagini recente » Cod sursa (job #1984735) | Cod sursa (job #1894963) | Cod sursa (job #2721358) | Cod sursa (job #4427) | Cod sursa (job #1535264)
#include <fstream>
#include <deque>
#include <iostream>
using namespace std;
#define f first
#define s second
ifstream fin("struti.in");
ofstream fout("struti.out");
int v[1010][1010],i,j,n,m,p,k[1010][1010],K[1010][1010],s,mini,maxi,ans,num,x,y,pr,o;
deque < int > d,D;
pair<int,int> a,b;
void solve( int x, int y )
{
for( i = 1 ; i <= n ; i++ )
{
while( d.size() )
d.pop_back();
while( D.size() )
D.pop_back();
for( j = 1 ; j < y ; j++ )
{
while( d.size() && v[ i ][ d.back() ] > v[ i ][ j ] )
d.pop_back();
d.push_back( j );
while( D.size() && v[ i ][ D.back() ] < v[ i ][ j ] )
D.pop_back();
D.push_back( j );
}
for( j = y ; j <= m ; j++ )
{
while( d.size() && v[ i ][ d.back() ] > v[ i ][ j ] )
d.pop_back();
d.push_back( j );
while( D.size() && v[ i ][ D.back() ] < v[ i ][ j ] )
D.pop_back();
D.push_back( j );
if( d.front() < j - y + 1 )
d.pop_front();
if( D.front() < j - y + 1 )
D.pop_front();
k[ i ][ j - y + 1 ] = v[ i ][ d.front() ];
K[ i ][ j - y + 1 ] = v[ i ][ D.front() ];
}
}
for( j = 1 ; j <= m - y + 1 ; j++ )
{
while( d.size() )
d.pop_back();
while( D.size() )
D.pop_back();
for( i = 1 ; i < x ; i++ )
{
while( d.size() && k[ d.back() ][ j ] > k[ i ][ j ] )
d.pop_back();
d.push_back( i );
while( D.size() && K[ D.back() ][ j ] < K[ i ][ j ] )
D.pop_back();
D.push_back( i );
}
for( i = x ; i <= n ; i++ )
{
while( d.size() && k[ d.back() ][ j ] > k[ i ][ j ] )
d.pop_back();
d.push_back( i );
while( D.size() && K[ D.back() ][ j ] < K[ i ][ j ] )
D.pop_back();
D.push_back( i );
if( d.front() < i - x + 1 )
d.pop_front();
if( D.front() < i - x + 1 )
D.pop_front();
pr = K[ D.front() ][ j ] - k[ d.front() ][ j ];
if( pr < ans )
{
ans = pr;
num = 1;
}
else if( pr == ans )
{
num++;
}
}
}
}
int main()
{
fin>>n>>m>>p;
for( i = 1 ; i <= n ; i++ )
{
for( j = 1 ; j <= m ; j++ )
{
fin>>v[ i ][ j ];
}
}
for( o = 1 ; o <= p ; o++ )
{
fin>>x>>y;
ans = 999999;
num = 0;
while( d.size() )
d.pop_back();
while( D.size() )
D.pop_back();
solve( x , y );
if( x != y ) solve( y , x );
fout<<ans<<' '<<num<<'\n';
}
return 0;
}