Cod sursa(job #358415)
Utilizator | Data | 22 octombrie 2009 23:35:42 | |
---|---|---|---|
Problema | Struti | Scor | 80 |
Compilator | cpp | Status | done |
Runda | Arhiva de probleme | Marime | 5.31 kb |
#include <stdio.h>
long v[1010][1010], ax[1010][1010], bx[1010][1010], ay[1010][1010], by[1010][1010], dq[1010];
long n, m, p, i, j, k, o, a, b, min, l, nrc;
int main()
{
min=2000000;
freopen("struti.in","r",stdin);
freopen("struti.out","w",stdout);
scanf("%ld %ld %ld", &n, &m, &p);
for(i=1; i<=n; i++)
{
for(j=1; j<=m; j++)
scanf("%ld", &v[i][j]);
}
for(l=1; l<=p; l++)
{
scanf("%ld %ld", &a, &b);
nrc=0;
min=2000000;
for(i=1; i<=n; i++)
{
k=1;
o=1;
dq[1]=1;
for(j=1; j<a; j++)
{
while((v[i][dq[k]]>=v[i][j])&&(k>=o))
k--;
k++;
dq[k]=j;
}
for(j=a; j<=m; j++)
{
if(dq[o]<=j-a)
o++;
while((v[i][dq[k]]>=v[i][j])&&(k>=o))
k--;
k++;
dq[k]=j;
ax[i][j]=v[i][dq[o]];
}
k=1;
o=1;
dq[1]=1;
for(j=1; j<a; j++)
{
while((v[i][dq[k]]<=v[i][j])&&(k>=o))
k--;
k++;
dq[k]=j;
}
for(j=a; j<=m; j++)
{
if(dq[o]<=j-a)
o++;
while((v[i][dq[k]]<=v[i][j])&&(k>=o))
k--;
k++;
dq[k]=j;
bx[i][j]=v[i][dq[o]];
}
}
for(i=a; i<=m; i++)
{
k=1;
o=1;
dq[1]=1;
for(j=1; j<b; j++)
{
while((ax[dq[k]][i]>=ax[j][i])&&(k>=o))
k--;
k++;
dq[k]=j;
}
for(j=b; j<=n; j++)
{
if(dq[o]<=j-b)
o++;
while((ax[dq[k]][i]>=ax[j][i])&&(k>=o))
k--;
k++;
dq[k]=j;
ay[j][i]=ax[dq[o]][i];
}
k=1;
o=1;
dq[1]=1;
for(j=1; j<b; j++)
{
while((bx[dq[k]][i]<=bx[j][i])&&(k>=o))
k--;
k++;
dq[k]=j;
}
for(j=b; j<=n; j++)
{
if(dq[o]<=j-b)
o++;
while((bx[dq[k]][i]<=bx[j][i])&&(k>=o))
k--;
k++;
dq[k]=j;
by[j][i]=bx[dq[o]][i];
if (by[j][i]-ay[j][i]<min)
{
min=by[j][i]-ay[j][i];
nrc=0;
}
if (by[j][i]-ay[j][i]==min)
{
nrc++;
}
}
}
if(a!=b){
for(i=1; i<=n; i++)
{
k=1;
o=1;
dq[1]=1;
for(j=1; j<b; j++)
{
while((v[i][dq[k]]>=v[i][j])&&(k>=o))
k--;
k++;
dq[k]=j;
}
for(j=b; j<=m; j++)
{
if(dq[o]<=j-b)
o++;
while((v[i][dq[k]]>=v[i][j])&&(k>=o))
k--;
k++;
dq[k]=j;
ax[i][j]=v[i][dq[o]];
}
k=1;
o=1;
dq[1]=1;
for(j=1; j<b; j++)
{
while((v[i][dq[k]]<=v[i][j])&&(k>=o))
k--;
k++;
dq[k]=j;
}
for(j=b; j<=m; j++)
{
if(dq[o]<=j-b)
o++;
while((v[i][dq[k]]<=v[i][j])&&(k>=o))
k--;
k++;
dq[k]=j;
bx[i][j]=v[i][dq[o]];
}
}
for(i=b; i<=m; i++)
{
k=1;
o=1;
dq[1]=1;
for(j=1; j<a; j++)
{
while((ax[dq[k]][i]>=ax[j][i])&&(k>=o))
k--;
k++;
dq[k]=j;
}
for(j=a; j<=n; j++)
{
if(dq[o]<=j-a)
o++;
while((ax[dq[k]][i]>=ax[j][i])&&(k>=o))
k--;
k++;
dq[k]=j;
ay[j][i]=ax[dq[o]][i];
}
k=1;
o=1;
dq[1]=1;
for(j=1; j<a; j++)
{
while((bx[dq[k]][i]<=bx[j][i])&&(k>=o))
k--;
k++;
dq[k]=j;
}
for(j=a; j<=n; j++)
{
if(dq[o]<=j-a)
o++;
while((bx[dq[k]][i]<=bx[j][i])&&(k>=o))
k--;
k++;
dq[k]=j;
by[j][i]=bx[dq[o]][i];
if (by[j][i]-ay[j][i]<min)
{
min=by[j][i]-ay[j][i];
nrc=0;
}
if (by[j][i]-ay[j][i]==min)
{
nrc++;
}
}
} }
printf("%ld %ld\n",min,nrc);
}
return 0;
}