Pagini recente » Cod sursa (job #2689895) | Cod sursa (job #2337401) | Cod sursa (job #2133418) | Cod sursa (job #1593367) | Cod sursa (job #1535316)
#include <iostream>
#include <vector>
#include <fstream>
#include <algorithm>
#include <cstring>
#include <deque>
//#define x first
//#define y second
using namespace std;
ifstream fin("struti.in");
ofstream fout("struti.out");
int n,m,ld,ls,mini[1001][1001],rasp,i,j,x,y,z,d,v[1001][1001],maxi[1001][1001],k,a,ok,b,nr;
deque < int > d1,d2;
void go(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==rasp)
nr++;
if(k<rasp)
{
rasp=k;
nr=1;
}
}
}
d1.clear();
d2.clear();
}
}
int main()
{
fin>>n>>m>>b;
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
fin>>v[i][j];
for(a=1;a<=b;a++)
{
int x,y;
fin>>x>>y;
d1.clear();
d2.clear();
rasp=9999919919;
go(x,y);
if(x!=y)
go(y,x);
fout<<rasp<<" "<<nr<<'\n';
}
return 0;
}