Pagini recente » Cod sursa (job #704395) | Cod sursa (job #511180) | Cod sursa (job #2234510) | Borderou de evaluare (job #2008059) | Cod sursa (job #1813787)
#include <fstream>
#define Ndim 1002
using namespace std;
ifstream fin("struti.in");
ofstream fout("struti.out");
short int A[Ndim][Ndim],DQ[Ndim],Aux[Ndim][Ndim],Mix[2][Ndim][Ndim],N,M,P,DX,DY,Min,nrsol;
void deque_line(int d,bool OK)
{
int i,j;
for(i=1;i<=N;i++)
{
int st=1,dr=1;
DQ[0] = DQ[1] = 0;
for(j=1;j<=M;j++)
{
if(OK==1)
while(dr>=st && A[i][j]>A[i][DQ[dr]])
dr--;
else
while(dr>=st && A[i][j]<A[i][DQ[dr]])
dr--;
DQ[++dr] = j;
if(DQ[dr] - DQ[st] + 1 > d)
st++;
Aux[i][j] = A[i][DQ[st]];
}
}
}
void deque_col(int d,int OK)
{
int i,j;
for(j=1;j<=M;j++)
{
int st=1,dr=1;
DQ[1]= DQ[0] = 0;
for(i=1;i<=N;i++)
{
if(OK==1)
while(dr>=st && Aux[i][j] > Aux[DQ[dr]][j])
dr--;
else
while(dr>=st && Aux[i][j] < Aux[DQ[dr]][j])
dr--;
DQ[++dr] = i;
if(DQ[dr] - DQ[st] + 1 > d)
st++;
Mix[OK][i][j] = Aux[DQ[st]][j];
}
}
}
int main()
{
fin>>N>>M>>P;
for(int i=1;i<=N;i++)
for(int j=1;j<=M;j++)
fin>>A[i][j];
while(P--)
{
fin>>DX>>DY;
deque_line(DX,1);
deque_col(DY,1);
deque_line(DX,0);
deque_col(DY,0);
Min = 8001;
nrsol = 0;
for(int i=DY;i<=N;i++)
for(int j=DX;j<=M;j++)
if(Min > Mix[1][i][j]-Mix[0][i][j])
{
Min = Mix[1][i][j]-Mix[0][i][j];
nrsol = 1;
}
else if(Min == Mix[1][i][j]-Mix[0][i][j])
nrsol++;
if(DX==DY)
{
fout<<Min<<' '<<nrsol<<'\n';
continue;
}
deque_line(DY,1);
deque_col(DX,1);
deque_line(DY,0);
deque_col(DX,0);
for(int i=DX;i<=N;i++)
for(int j=DY;j<=M;j++)
if(Min > Mix[1][i][j]-Mix[0][i][j])
{
Min = Mix[1][i][j]-Mix[0][i][j];
nrsol = 1;
}
else if(Min == Mix[1][i][j]-Mix[0][i][j])
nrsol++;
fout<<Min<<' '<<nrsol<<'\n';
}
return 0;
}