Pagini recente » Cod sursa (job #1092559) | Cod sursa (job #1958587) | Cod sursa (job #717723) | Cod sursa (job #1964118) | Cod sursa (job #1717758)
#include <cstdio>
#define MAX 1000
#define INF 8001
using namespace std;
struct aa{
int x, y;
}d1[MAX+1], d2[MAX+1];
int v[MAX+1][MAX+1], n, m, a1[MAX+1][MAX+1], a2[MAX+1][MAX+1], mini, nrmin;
inline void calc(int dx, int dy)
{
int st1, dr1, st2, dr2, s;
for(int j=1;j<=m;++j)
{
st1=st2=dr1=dr2=0;
d1[st1].x=d2[st2].x=1;
d1[st1].y=d2[st2].y=j;
a1[1][j]=a2[1][j]=v[1][j];
for(int i=2;i<=n;++i)
{
while(d1[st1].x <= i-dx)
st1++;
while(v[d1[dr1].x][d1[dr1].y] <= v[i][j] && dr1 >= st1)
dr1--;
d1[++dr1].x=i;
d1[dr1].y=j;
while(d2[st2].x <= i-dx)
st2++;
while(v[d2[dr2].x][d2[dr2].y] >= v[i][j] && dr2 >= st2)
dr2--;
d2[++dr2].x=i;
d2[dr2].y=j;
a1[i][j]=v[d1[st1].x][d1[st1].y];
a2[i][j]=v[d2[st2].x][d2[st2].y];
}
}
for(int i=dx;i<=n;++i)
{
st1=dr1=st2=dr2=0;
d1[st1].x=i;
d1[st1].y=1;
d2[st2].x=i;
d2[st2].y=1;
for(int j=2;j<=m;++j)
{
while(d1[st1].y <= j-dy)
st1++;
while(d2[st2].y <= j-dy)
st2++;
while(a1[d1[dr1].x][d1[dr1].y] <= a1[i][j] && dr1 >= st1)
dr1--;
while(a2[d2[dr2].x][d2[dr2].y] >= a2[i][j] && dr2 >= st2)
dr2--;
d1[++dr1].x=i;
d1[dr1].y=j;
d2[++dr2].x=i;
d2[dr2].y=j;
if(j>=dy)
{
s=a1[d1[st1].x][d1[st1].y] - a2[d2[st2].x][d2[st2].y];
if( mini > s)
{
mini=s;
nrmin=1;
}
else if(mini == s)
nrmin++;
}
}
}
}
int main()
{
freopen("struti.in", "r", stdin);
freopen("struti.out", "w", stdout);
int p, dx, dy;
scanf("%d%d%d", &n, &m, &p);
for(int i=1;i<=n;++i)
for(int j=1;j<=m;++j)
scanf("%d", &v[i][j]);
for(int a=1;a<=p;++a)
{
scanf("%d%d", &dx, &dy);
mini=INF;
calc(dx, dy);
if(dx != dy) calc(dy, dx);
printf("%d %d\n", mini, nrmin);
}
return 0;
}