Cod sursa(job #358417)

Utilizator allynaAlina S allyna Data 22 octombrie 2009 23:39:27
Problema Struti Scor 0
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],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("%lld %lld %lld", &n, &m, &p);   
    for(i=1; i<=n; i++)   
    {   
        for(j=1; j<=m; j++)   
        scanf("%lld", &v[i][j]);   
    }   
    for(l=1; l<=p; l++)
    {
    scanf("%lld %lld", &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("%lld %lld\n",min,nrc);
    }
    return 0;
}