Cod sursa(job #209614)

Utilizator GavrilaVladGavrila Vlad GavrilaVlad Data 23 septembrie 2008 17:55:03
Problema Struti Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 5.51 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("%d %d %d", &n, &m, &p);   
    for(i=1; i<=n; i++)   
    {   
        for(j=1; j<=m; j++)   
        scanf("%d", &v[i][j]);   
    }   
    for(l=1; l<=p; l++)
    {
    scanf("%d %d", &a, &b);   
    for(i=1; i<=n; i++)
    {
        for(j=1; j<=m; j++)
        {
            ax[i][j]=0;
            ay[i][j]=0;
            bx[i][j]=0;
            by[i][j]=0;
        }
    }
    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++;
            }
        }   
    }  
    
    
    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++;
            }
                
        }   
    }  
    if (a==b) nrc = nrc / 2;
    printf("%d %d\n",min,nrc);
    }
    return 0;
}