Cod sursa(job #552823)

Utilizator Magnuscont cu nume gresit sau fals Magnus Data 12 martie 2011 22:05:58
Problema Struti Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.49 kb
#include <stdio.h>

int v[1024][1024],d[1024],e[1024],p[1024],q[1024],x[1024][1024],y[1024][1024],n,m,t,a,b,l1,l2,r1,r2,c,min,aux;

int main()
{
    int i,j,k,z;
    freopen("struti.in","r",stdin);
    freopen("struti.out","w",stdout);
    scanf("%d%d%d",&n,&m,&t);
    for (i=1;i<=n;++i)
        for (j=1;j<=m;++j)
            scanf("%d",&v[i][j]);
    for (i=1;i<=t;++i)
    {
        scanf("%d%d",&a,&b);
        z=0;min=160001;
        while (z<(a!=b)+1)
        {
            ++z;
            for (j=1;j<=n;++j)
            {
                l1=1;l2=1;r1=1;r2=1;p[1]=1;q[1]=1;
                d[1]=v[j][1];e[1]=v[j][1];
                for (k=2;k<b;++k)
                {
                    while ((r1>0)&&(d[r1]>v[j][k])) --r1;
                    while ((r2>0)&&(e[r2]<v[j][k])) --r2;
                    ++r1;++r2;p[r1]=k;q[r2]=k;
                    d[r1]=v[j][k];e[r2]=v[j][k];
                }
                for (k=b;k<=m;++k)
                {
                    if (p[l1]==k-b) ++l1;
                    if (q[l2]==k-b) ++l2;
                    while ((r1>=l1)&&(d[r1]>v[j][k])) --r1;
                    while ((r2>=l2)&&(e[r2]<v[j][k])) --r2;
                    ++r1;++r2;p[r1]=k;q[r2]=k;
                    d[r1]=v[j][k];e[r2]=v[j][k];
                    x[j][k]=d[l1];y[j][k]=e[l2];
                }
            }
            for (j=b;j<=m;++j)
            {
                l1=1;l2=1;r1=1;r2=1;p[1]=1;q[1]=1;
                d[1]=x[1][j];e[1]=y[1][j];
                for (k=2;k<a;++k)
                {
                    while ((r1>0)&&(d[r1]>x[k][j])) --r1;
                    while ((r2>0)&&(e[r2]<y[k][j])) --r2;
                    ++r1;++r2;p[r1]=k;q[r2]=k;
                    d[r1]=x[k][j];e[r2]=y[k][j];
                }
                for (k=a;k<=n;++k)
                {
                    if (p[l1]==k-a) ++l1;
                    if (q[l2]==k-a) ++l2;
                    while ((r1>=l1)&&(d[r1]>x[k][j])) --r1;
                    while ((r2>=l2)&&(e[r2]<y[k][j])) --r2;
                    ++r1;++r2;p[r1]=k;q[r2]=k;
                    d[r1]=x[k][j];e[r2]=y[k][j];
                    if (e[l2]-d[l1]==min)
                        ++c;
                    else if (e[l2]-d[l1]<min)
                    {
                        min=e[l2]-d[l1];
                        c=1;
                    }
                }
            }
            aux=a;a=b;b=aux;
        }
        printf("%d %d\n",min,c);
    }
    return 0;
}