Mai intai trebuie sa te autentifici.

Cod sursa(job #79564)

Utilizator sealTudose Vlad seal Data 23 august 2007 02:31:28
Problema Struti Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.45 kb
using namespace std;
#include<cstdio>
#define Nm 1000
#define Inf 8001
int M[Nm][Nm],n,m,p;
int Minc[Nm][Nm],Maxc[Nm][Nm],Lminc[Nm],Lmaxc[Nm],Rminc[Nm],Rmaxc[Nm];
int Min[Nm],Max[Nm],lmin,lmax,rmin,rmax;

void read()
{
    int i,j;

    freopen("struti.in","r",stdin);
    scanf("%d%d%d",&n,&m,&p);
    for(i=0;i<n;++i)
        for(j=0;j<m;++j)
            scanf("%d",&M[i][j]);
}

int difmin,nr;

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

    for(j=0;j<m;++j)
    {
        Lminc[j]=Lmaxc[j]=0;
        Rminc[j]=Rmaxc[j]=-1;
    }

    for(i=0;i<n;++i)
    {
        lmin=lmax=0;
        rmin=rmax=-1;
        for(j=0;j<m;++j)
        {
            while(Lminc[j]<=Rminc[j] && M[i][j]<M[Minc[j][Rminc[j]]][j])
                --Rminc[j];
            Minc[j][++Rminc[j]]=i;
            
            while(Lmaxc[j]<=Rmaxc[j] && M[i][j]>M[Maxc[j][Rmaxc[j]]][j])
                --Rmaxc[j];
            Maxc[j][++Rmaxc[j]]=i;
            
            if(i>=a-1)
            {
                if(Minc[j][Lminc[j]]==i-a)
                    ++Lminc[j];
                if(Maxc[j][Lmaxc[j]]==i-a)
                    ++Lmaxc[j];

                while(lmin<=rmin && M[Minc[j][Lminc[j]]][j]<M[Minc[Min[rmin]][Lminc[Min[rmin]]]][Min[rmin]])
                    --rmin;
                Min[++rmin]=j;

                while(lmax<=rmax && M[Maxc[j][Lmaxc[j]]][j]>M[Maxc[Max[rmax]][Lmaxc[Max[rmax]]]][Max[rmax]])
                    --rmax;
                Max[++rmax]=j;

                if(j>=b-1)
                {
                    if(Min[lmin]==j-b)
                        ++lmin;
                    if(Max[lmax]==j-b)
                        ++lmax;
                        
                    dif=M[Maxc[Max[lmax]][Lmaxc[Max[lmax]]]][Max[lmax]]-M[Minc[Min[lmin]][Lminc[Min[lmin]]]][Min[lmin]];
                    if(dif==difmin)
                        ++nr;
                    else
                        if(dif<difmin)
                        {
                            difmin=dif;
                            nr=1;
                        }
                }
            }
        }
    }
}

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;
}