Pagini recente » Cod sursa (job #2919085) | Cod sursa (job #2023127) | Cod sursa (job #3259715) | Cod sursa (job #2258524) | Cod sursa (job #495004)
Cod sursa(job #495004)
#include<stdio.h>
#include<string.h>
int mmax[1010 ][ 1010],mmin[1010][1010],Mmax[1010][1010],Mmin[1010][1010],i,j,dmin[ 1010 ],dmax[ 1010],pmin,umin,
pmax,umax,k,l,m,n,a[1010][1010],dx,dy,nr,Dmin;
void solve(int dx,int dy){
int i,j;
pmin = pmax = 1;
umin = umax = 0;
for(i = 1 ; i <= n ; i++){
pmin = pmax = 1;
umin = umax = 0;
for(j = 1 ; j <= m ; j++)
{while(a[i][j] > a[i][dmax[umax]] && umax >= pmax)
umax--;
umax++;
dmax[umax] = j;
while(dmax[pmax] <= j-dy)pmax++;
while(a[i][j] <= a[i][dmin[umin] ]&& umin >= pmin)
umin--;
umin++;
dmin[umin] = j;
while(dmin[pmin] <= j-dy)pmin++;
if(j>=dy){
mmax[i][j] = a[i][dmax[pmax]];
mmin[i][j] = a[i][dmin[pmin]];
}
}
}
for(j = dy ; j <= m; j++)
{pmax = pmin = 1;
umax = umin = 0;
for(i = 1 ; i <= n ; i++)
{while(mmax[i][j] > mmax[dmax[umax]][j] && umax >= pmax)
umax--;
umax++;
dmax[umax] = i;
while(dmax[pmax] <= i-dx)pmax++;
while(mmin[i][j] < mmin[dmin[umin]][j] && umin>= pmin)
umin--;
umin++;
dmin[umin] = i;
while(dmin[pmin]<=i-dx)pmin++;
if(i >= dx){
Mmax[i][j] = mmax[dmax[pmax]][j];
Mmin[i][j] = mmin[dmin[pmin]][j];
if(Mmax[i][j] - Mmin[i][j] < Dmin)
{nr = 1;
Dmin = Mmax[i][j] - Mmin[i][j];}
else
if(Mmax[i][j] - Mmin[i][j] == Dmin)
nr++;
}
}
}
}
void citire(){
freopen("struti.in","r",stdin);
freopen("struti.out","w",stdout);
int P,i,j;
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(i = 1 ; i<= P; i++)
{scanf("%d %d",&dx,&dy);
Dmin = 1<<30;
nr = 0;
if(dx != dy){
solve(dx,dy);
solve(dy,dx);}
else
solve(dx,dy);
printf("%d %d\n",Dmin,nr);
}
}
int main(){
citire();
return 0;}