Pagini recente » Cod sursa (job #2779221) | Cod sursa (job #1459603) | Cod sursa (job #561157) | Cod sursa (job #2208577) | Cod sursa (job #3210240)
#include <fstream>
#include <deque>
using namespace std;
ifstream fin ("struti.in");
ofstream fout ("struti.out");
deque <int> q;
pair <int,int> r1,r2;
int p,t,i,j,a,b,n,m;
int v[1001][1001],maxim[1001][1001],minim[1001][1001],lin[1001][1001];
bool cmp (int x,int y,int ok)
{
if (ok==1)
{
if (x>=y)
return 1;
else
return 0;
}
else
{
if (x<=y)
return 1;
else
return 0;
}
}
void calc (bool ok,int a,int b)
{
for (int i=1; i<=n; i++)
{
q.clear ();
for (int j=1; j<=m; j++)
{
int x=v[i][j];
while (!q.empty ()&&cmp (x,v[i][q.back()],ok))
q.pop_back ();
q.push_back (j);
if (j>=b)
{
lin[i][j]=v[i][q.front ()];
if (j-q.front ()+1==b)
q.pop_front ();
}
}
}
for (int j=b; j<=m; j++)
{
q.clear ();
for (int i=1; i<=n; i++)
{
int x=lin[i][j];
while (!q.empty ()&&cmp (x,lin[q.back ()][j],ok))
q.pop_back ();
q.push_back (i);
if (i>=a)
{
if (ok==1)
maxim[i][j]=lin[q.front ()][j];
else
minim[i][j]=lin[q.front ()][j];
if (i-q.front ()+1==a)
q.pop_front ();
}
}
}
}
pair <int,int> f (int a,int b)
{
calc (1,a,b);
calc (0,a,b);
int sol=16001,nr=0;
for (int i=a; i<=n; i++)
{
for (int j=b; j<=m; j++)
{
if (maxim[i][j]-minim[i][j]<sol)
{
sol=maxim[i][j]-minim[i][j];
nr=1;
}
else if (maxim[i][j]-minim[i][j]==sol)
nr++;
}
}
return make_pair (sol,nr);
}
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>>a>>b;
r1=f (a,b);
r2=f (b,a);
if (a==b)
fout<<r1.first<<" "<<r1.second<<"\n";
else
{
if (r1.first<r2.first)
fout<<r1.first<<" "<<r1.second<<"\n";
else if (r2.first<r1.first)
fout<<r2.first<<" "<<r2.second<<"\n";
else
fout<<r1.first<<" "<<r1.second+r2.second<<"\n";
}
}
return 0;
}