Pagini recente » Cod sursa (job #2538378) | Cod sursa (job #144662) | Diferente pentru implica-te/arhiva-educationala intre reviziile 210 si 211 | Cod sursa (job #3287511) | Cod sursa (job #3210684)
#include <fstream>
#include <deque>
using namespace std;
ifstream fin ("struti.in");
ofstream fout ("struti.out");
struct sol
{
int x,nr;
};
sol p1,p2;
int n,m,dif,nrq,x,y,i,j,q;
int v[1001][1001],minx[1001][1001],maxx[1001][1001],aux[1001][1001];
deque <int> deq;
bool comp (int a,int b,int ok)
{
if (ok==1)
{
if (a<=b)
return 1;
else
return 0;
}
else
{
if (a>=b)
return 1;
else
return 0;
}
}
void fct (bool val,int x,int y)
{
for (int i=1; i<=n; i++)
{
deq.clear ();
for (int j=1; j<=m; j++)
{
while (!deq.empty ()&&comp (v[i][j],v[i][deq.back ()],val))
deq.pop_back ();
deq.push_back (j);
if (j>=y)
{
aux[i][j]=v[i][deq.front ()];
if (j-deq.front ()+1==y)
deq.pop_front ();
}
}
}
for (int j=y; j<=m; j++)
{
deq.clear ();
for (int i=1; i<=n; i++)
{
while (!deq.empty ()&&comp (aux[i][j],aux[deq.back ()][j],val))
deq.pop_back ();
deq.push_back (i);
if (i>=x)
{
if (val==1)
minx[i][j]=aux[deq.front ()][j];
else
maxx[i][j]=aux[deq.front ()][j];
if (i-deq.front ()+1==x)
deq.pop_front ();
}
}
}
}
sol solve (int x,int y)
{
fct (1,x,y);
fct (0,x,y);
sol ans= {16000,0};
for (int i=x; i<=n; i++)
{
for (int j=y; j<=m; j++)
{
dif=maxx[i][j]-minx[i][j];
if (dif<ans.x)
{
ans.x=dif;
ans.nr=1;
}
else if (dif==ans.x)
ans.nr++;
}
}
return ans;
}
int main()
{
fin>>n>>m>>nrq;
for (i=1; i<=n; i++)
{
for (j=1; j<=m; j++)
fin>>v[i][j];
}
for (q=1; q<=nrq; q++)
{
fin>>x>>y;
p1=solve (x,y);
p2=solve (y,x);
if (x==y)
fout<<p1.x<<" "<<p1.nr;
else if (p1.x<p2.x)
fout<<p1.x<<" "<<p1.nr;
else if (p2.x<p1.x)
fout<<p2.x<<" "<<p2.nr;
else
fout<<p1.x<<" "<<p1.nr+p2.nr;
fout<<"\n";
}
return 0;
}