Pagini recente » Cod sursa (job #806021) | Rating luka mosiashvili (lukamosiashvili) | Cod sursa (job #1672911) | Cod sursa (job #1735735) | Cod sursa (job #269537)
Cod sursa(job #269537)
#include <cstdio>
#define inf 0x3f3f3f3f
#include <deque>
#define N 1001
using namespace std;
int m,n,p,i,j,dx,dy,kont,minim;
int A[N][N],Max[N][N],Min[N][N];
deque<int> DQ;
void matrici(int x, int y)
{
int i,j;
//Maxim
for (i=1; i<=n; i++, DQ.clear())
for (j=1; j<=m; j++)
{
while (!DQ.empty() && A[i][j]>=A[i][DQ.back()]) DQ.pop_back();
DQ.push_back(j);
if (DQ.front()<j-y+1) DQ.pop_front();
if (j>=y) Max[i][j-y+1]=A[i][DQ.front()];
}
for (j=1; j<=m-y+1; j++, DQ.clear())
for (i=1; i<=n; i++)
{
while (!DQ.empty() && Max[i][j]>=Max[DQ.back()][j]) DQ.pop_back();
DQ.push_back(i);
if (DQ.front()<i-x+1) DQ.pop_front();
if (i>=x) Max[i-x+1][j]=Max[DQ.front()][j];
}
//Minim
for (i=1; i<=n; i++, DQ.clear())
for (j=1; j<=m; j++)
{
while (!DQ.empty() && A[i][j]<=A[i][DQ.back()]) DQ.pop_back();
DQ.push_back(j);
if (DQ.front()<j-y+1) DQ.pop_front();
if (j>=y) Min[i][j-y+1]=A[i][DQ.front()];
}
for (j=1; j<=m-y+1; j++, DQ.clear())
for (i=1; i<=n; i++)
{
while (!DQ.empty() && Min[i][j]<=Min[DQ.back()][j]) DQ.pop_back();
DQ.push_back(i);
if (DQ.front()<i-x+1) DQ.pop_front();
if (i>=x) Min[i-x+1][j]=Min[DQ.front()][j];
}
}
void calcule(int x, int y)
{
for (i=1; i<=n-x+1; i++)
for (j=1; j<=m-y+1; j++)
if (Max[i][j]-Min[i][j]<minim)
{
minim=Max[i][j]-Min[i][j];
kont=1;
}
else
if (Max[i][j]-Min[i][j]==minim) kont++;
}
int main()
{
freopen("struti.in","r",stdin);
freopen("struti.out","w",stdout);
scanf("%d%d%d\n",&n,&m,&p);
for (i=1; i<=n; i++)
for (j=1; j<=m; j++) scanf("%d",&A[i][j]);
while (p--)
{
scanf("%d%d\n",&dx,&dy);
matrici(dx,dy);
minim=inf;
calcule(dx,dy);
if (dx!=dy)
{
matrici(dy,dx);
calcule(dy,dx);
}
printf("%d %d\n",minim,kont);
}
return 0;
}