Cod sursa(job #79633)

Utilizator sealTudose Vlad seal Data 23 august 2007 13:09:38
Problema Struti Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 4.59 kb
#include<stdio.h>
#define Nm 1000
#define Inf 8001
int M[Nm][Nm],n,m,p;
int Minvc[Nm][Nm],Minpc[Nm][Nm],Maxvc[Nm][Nm],Maxpc[Nm][Nm];
int Lmin[Nm],Rmin[Nm],Lmax[Nm],Rmax[Nm],lmin,rmin,lmax,rmax;
int Minv[Nm],Minp[Nm],Maxv[Nm],Maxp[Nm];

void read()
{
    char S[5*Nm];
    int i,j,k;

    freopen("struti.in","r",stdin);
    scanf("%d%d%d\n",&n,&m,&p);
    for(i=0;i<n;++i)
    {
        gets(S); k=-1;
        for(j=0;j<m;++j)
            for(++k;S[k]!=' ' && S[k];++k)
                M[i][j]=M[i][j]*10+S[k]-'0';
    }
}

int difmin,nr;

void query(int a, int b)
{
    int i,j,v;

    for(j=0;j<m;++j)
    {
        Lmin[j]=Lmax[j]=0;
        Rmin[j]=Rmax[j]=-1;
    }

    for(i=0;i<a;++i)
        for(j=0;j<m;++j)
        {
            v=M[i][j];
            
            while(Lmin[j]<=Rmin[j] && v<Minvc[j][Rmin[j]])
                --Rmin[j];
            Minvc[j][++Rmin[j]]=v;
            Minpc[j][Rmin[j]]=i;

            while(Lmax[j]<=Rmax[j] && v>Maxvc[j][Rmax[j]])
                --Rmax[j];
            Maxvc[j][++Rmax[j]]=v;
            Maxpc[j][Rmax[j]]=i;
        }

    for(;i<n;++i)
    {
        lmin=lmax=0;
        rmin=rmax=-1;
        for(j=0;j<b;++j)
        {
            v=Minvc[j][Lmin[j]];
            while(lmin<=rmin && v<Minv[rmin])
                --rmin;
            Minv[++rmin]=v;
            Minp[rmin]=j;

            v=Maxvc[j][Lmax[j]];
            while(lmax<=rmax && v>Maxv[rmax])
                --rmax;
            Maxv[++rmax]=v;
            Maxp[rmax]=j;
        }
        
        for(;j<m;++j)
        {
            v=Maxv[lmax]-Minv[lmin];
            if(v<difmin)
            {
                difmin=v;
                nr=1;
            }
            else
                if(v==difmin)
                    ++nr;

            v=Minvc[j][Lmin[j]];
            while(lmin<=rmin && v<Minv[rmin])
                --rmin;
            Minv[++rmin]=v;
            Minp[rmin]=j;
            if(Minp[lmin]==j-b)
                ++lmin;

            v=Maxvc[j][Lmax[j]];
            while(lmax<=rmax && v>Maxv[rmax])
                --rmax;
            Maxv[++rmax]=v;
            Maxp[rmax]=j;
            if(Maxp[lmax]==j-b)
                ++lmax;
        }
        
        v=Maxv[lmax]-Minv[lmin];
        if(v<difmin)
        {
            difmin=v;
            nr=1;
        }
        else
            if(v==difmin)
                ++nr;

        for(j=0;j<m;++j)
        {
            v=M[i][j];
            
            while(Lmin[j]<=Rmin[j] && v<Minvc[j][Rmin[j]])
                --Rmin[j];
            Minvc[j][++Rmin[j]]=v;
            Minpc[j][Rmin[j]]=i;
            if(Minpc[j][Lmin[j]]==i-a)
                ++Lmin[j];

            while(Lmax[j]<=Rmax[j] && v>Maxvc[j][Rmax[j]])
                --Rmax[j];
            Maxvc[j][++Rmax[j]]=v;
            Maxpc[j][Rmax[j]]=i;
            if(Maxpc[j][Lmax[j]]==i-a)
                ++Lmax[j];
        }
    }

        lmin=lmax=0;
        rmin=rmax=-1;
        for(j=0;j<b;++j)
        {
            v=Minvc[j][Lmin[j]];
            while(lmin<=rmin && v<Minv[rmin])
                --rmin;
            Minv[++rmin]=v;
            Minp[rmin]=j;

            v=Maxvc[j][Lmax[j]];
            while(lmax<=rmax && v>Maxv[rmax])
                --rmax;
            Maxv[++rmax]=v;
            Maxp[rmax]=j;
        }
        
        for(;j<m;++j)
        {
            v=Maxv[lmax]-Minv[lmin];
            if(v<difmin)
            {
                difmin=v;
                nr=1;
            }
            else
                if(v==difmin)
                    ++nr;

            v=Minvc[j][Lmin[j]];
            while(lmin<=rmin && v<Minv[rmin])
                --rmin;
            Minv[++rmin]=v;
            Minp[rmin]=j;
            if(Minp[lmin]==j-b)
                ++lmin;

            v=Maxvc[j][Lmax[j]];
            while(lmax<=rmax && v>Maxv[rmax])
                --rmax;
            Maxv[++rmax]=v;
            Maxp[rmax]=j;
            if(Maxp[lmax]==j-b)
                ++lmax;
        }
        
        v=Maxv[lmax]-Minv[lmin];
        if(v<difmin)
        {
            difmin=v;
            nr=1;
        }
        else
            if(v==difmin)
                ++nr;
}

void solve()
{
    int a,b;

    freopen("struti.out","w",stdout);
    while(p--)
    {
        scanf("%d%d",&a,&b);
        difmin=Inf;
        query(a,b);
        if(a!=b)
            query(b,a);
        printf("%d %d\n",difmin,nr);
    }
}

int main()
{
    read();
    solve();
    return 0;
}