Pagini recente » Cod sursa (job #97428) | Cod sursa (job #2511053) | Cod sursa (job #1283159) | Cod sursa (job #2726079) | Cod sursa (job #2065175)
#include <stdio.h>
#include <bits/stdc++.h>
using namespace std;
struct matrix
{
int val,minval,maxval,dif;
}a[1002][1002];
int deqmin[1001],deqmax[1001];
int n,m;
struct rez
{
int val,nr;
}mindif;
void verif(int l,int c)
{
int i,j,pmin,umin,pmax,umax;
for(j=1; j<=m; j++)
{
pmin=pmax=1;
umin=umax=0;
for(i=1; i<=l; i++)
{
while(umax>0 && a[deqmax[umax]][j].val<=a[i][j].val)
umax--;
while(umin>0 && a[deqmin[umin]][j].val>=a[i][j].val)
umin--;
deqmax[++umax]=i;
deqmin[++umin]=i;
}
a[l][j].minval=a[deqmin[1]][j].val;
a[l][j].maxval=a[deqmax[1]][j].val;
for(; i<=n; i++)
{
while(pmin<=umin && deqmin[pmin]<=i-l)
pmin++;
while(pmax<=umax && deqmax[pmax]<=i-l)
pmax++;
while(umax>=pmax && a[deqmax[umax]][j].val<=a[i][j].val)
umax--;
while(umin>=pmin && a[deqmin[umin]][j].val>=a[i][j].val)
umin--;
deqmax[++umax]=i;
deqmin[++umin]=i;
a[i][j].minval=a[deqmin[pmin]][j].val;
a[i][j].maxval=a[deqmax[pmax]][j].val;
}
}
for(i=l; i<=n; i++)
{
pmin=pmax=1;
umin=umax=0;
for(j=1; j<=c; j++)
{
while(umax>0 && a[i][deqmax[umax]].maxval<=a[i][j].maxval)
umax--;
while(umin>0 && a[i][deqmin[umin]].minval>=a[i][j].minval)
umin--;
deqmax[++umax]=j;
deqmin[++umin]=j;
}
a[i][c].dif=a[i][deqmax[pmax]].maxval-a[i][deqmin[pmin]].minval;
for(; j<=m; j++)
{
while(pmin<=umin && deqmin[pmin]<=j-c)
pmin++;
while(pmax<=umax && deqmax[pmax]<=j-c)
pmax++;
while(umax>=pmax && a[i][deqmax[umax]].maxval<=a[i][j].maxval)
umax--;
while(umin>=pmin && a[i][deqmin[umin]].minval>=a[i][j].minval)
umin--;
deqmax[++umax]=j;
deqmin[++umin]=j;
a[i][j].dif=a[i][deqmax[pmax]].maxval-a[i][deqmin[pmin]].minval;
}
}
for(i=l; i<=n; i++)
for(j=c; j<=m; j++)
if(a[i][j].dif<mindif.val)
mindif.val=a[i][j].dif,mindif.nr=1;
else
if(a[i][j].dif==mindif.val)
mindif.nr++;
}
int main()
{
int p,i,j,k,x,y;
freopen("struti.in","r",stdin);
freopen("struti.out","w",stdout);
scanf("%d%d%d",&n,&m,&p);
for(i=1; i<=n; i++)
for(j=1; j<=m; j++)
scanf("%d",&a[i][j]);
for(k=1; k<=p; k++)
{
scanf("%d%d",&x,&y);
mindif.val=8001;
mindif.nr=0;
verif(x,y);
if(x!=y) verif(y,x);
printf("%d %d\n",mindif.val,mindif.nr);
}
return 0;
}