Pagini recente » Cod sursa (job #2836519) | Cod sursa (job #363262) | Cod sursa (job #325301) | Cod sursa (job #1789341) | Cod sursa (job #1546603)
#include<fstream>
#include<deque>
#include<vector>
#include <cstring>
using namespace std;
ifstream fin("struti.in");
ofstream fout("struti.out");
int n,m,k,i,j,p,x,y,v[1005][1005],t,sol,cont,mini[1005][1005],maxi[1005][1005];
deque <int> d1,d2;
void solve(int x,int y)
{
for(i=1;i<=n;i++)
{
for(j=1;j<=m;j++)
{
while( !d1.empty() && v[ i ] [ d1.back() ] < v[ i ] [ j ] )
d1.pop_back();
while( !d2.empty() && v[ i ] [ d2.back() ] > v[ i ] [ j ] )
d2.pop_back();
if( !d1.empty() && d1.front() < j-y+1 )
d1.pop_front();
if( !d2.empty() && d2.front() < j-y+1 )
d2.pop_front();
d1.push_back(j);
d2.push_back(j);
if(j>=y)
{
mini[i][j-y+1]=v[i][ d2.front() ];
maxi[i][j-y+1]=v[i][ d1.front() ];
}
}
d1.clear();
d2.clear();
}
for(j=1;j<=m-y+1;j++)
{
for(i=1;i<=n;i++)
{
while( !d1.empty() && maxi[ d1.back() ][ j ] < maxi[ i ] [ j ] )
d1.pop_back();
while( !d2.empty() && mini[ d2.back() ][ j ] > mini[ i ] [ j ] )
d2.pop_back();
if( !d1.empty() && d1.front() < i-x+1 )
d1.pop_front();
if( !d2.empty() && d2.front() < i-x+1 )
d2.pop_front();
d1.push_back(i);
d2.push_back(i);
if(i>=x)
{
k=maxi[ d1.front() ][ j ] - mini[ d2.front() ][ j ];
if(k==sol)
cont++;
if(k<sol)
{
sol=k;
cont=1;
}
}
}
d1.clear();
d2.clear();
}
for(i=1;i<=n;i++)
{
for(j=1;j<=m;j++)
{
// fout<<maxi[i][j]<<" ";
}
//fout<<"\n";
}
for(i=1;i<=n;i++)
{
for(j=1;j<=m;j++)
{
//fout<<mini[i][j]<<" ";
}
//fout<<"\n";
}
}
int main()
{
fin>>n>>m>>p;
for(i=1;i<=n;i++)
{
for(j=1;j<=m;j++)
{
fin>>v[i][j];
}
}
for(t=1;t<=p;t++)
{
fin>>x>>y;
sol=2000000000;
cont=0;
solve(x,y);
if(x!=y) solve(y,x);
fout<<sol<<" "<<cont<<"\n";
}
}