Cod sursa(job #358405)

Utilizator allynaAlina S allyna Data 22 octombrie 2009 23:06:48
Problema Struti Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 5.32 kb
#include <stdio.h>
using namespace std;   
int x[1010][1010],a1[1010][1010],b1[1010][1010],a2[1010][1010],b2[1010][1010],deq[1010],n,m,p,i,j,k,k1,a,b,min,num;
int main()   
{   
    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",&x[i][j]);   
    }   
    for(i=1;i<=p;i++)
    {
    scanf("%d%d",&a,&b);   
    num=0;
    min=2000000;
    for(i=1; i<=n; i++)   
    {   
        k=1;   
        k1=1;   
        deq[1]=1;   
        for(j=1;j<a;j++)   
        {   
            while((x[i][deq[k]]>=x[i][j])&&(k>=k1))   
            k--;   
            k++;   
            deq[k]=j;   
        }   
        for(j=a;j<=m;j++)   
        {   
            if(deq[k1]<=j-a)   
                k1++;   
            while((x[i][deq[k]]>=x[i][j])&&(k>=k1))   
                k--;   
            k++;   
            deq[k]=j;   
            a1[i][j]=x[i][deq[k1]];   
        }   
        k=1;   
        k1=1;   
        deq[1]=1;   
        for(j=1;j<a;j++)   
        {   
            while((x[i][deq[k]]<=x[i][j])&&(k>=k1))   
                k--;   
            k++;   
            deq[k]=j;   
        }   
        for(j=a;j<=m;j++)   
        {   
            if(deq[k1]<=j-a)   
                k1++;   
            while((x[i][deq[k]]<=x[i][j])&&(k>=k1))   
                k--;   
            k++;   
            deq[k]=j;   
            b1[i][j]=x[i][deq[k1]];   
        }   
    }
    for(i=a;i<=m;i++)   
    {   
        k=1;   
        k1=1;   
        deq[1]=1;   
        for(j=1;j<b;j++)   
        {   
            while((a1[deq[k]][i]>=a1[j][i])&&(k>=k1))  
                k--;   
            k++;   
            deq[k]=j;
        }   
        for(j=b;j<=n;j++)   
        {   
            if(deq[k1]<=j-b)   
                k1++;   
            while((a1[deq[k]][i]>=a1[j][i])&&(k>=k1))   
                k--;   
            k++;   
            deq[k]=j; 
            a2[j][i]=a1[deq[k1]][i];   
        }  
        k=1;   
        k1=1;   
        deq[1]=1;   
        for(j=1;j<b;j++)   
        {   
            while((b1[deq[k]][i]<=b1[j][i])&&(k>=k1))   
                k--;   
            k++;   
            deq[k]=j;   
        }   
        for(j=b;j<=n;j++)   
        {   
            if(deq[k1]<=j-b)   
                k1++;   
            while((b1[deq[k]][i]<=b1[j][i])&&(k>=k1))   
                k--;   
            k++;   
            deq[k]=j;   
            b2[j][i]=b1[deq[k1]][i];  
            if (b2[j][i]-a2[j][i]<min)
            {
                min=b2[j][i]-a2[j][i]; 
                num=0;
            }
            if (b2[j][i]-a2[j][i]==min)
            {
                num++;
            }
        }   
    }  
    if(a!=b){
    for(i=1; i<=n; i++)   
    {   
        k=1;   
        k1=1;   
        deq[1]=1;   
        for(j=1;j<b;j++)   
        {   
            while((x[i][deq[k]]>=x[i][j])&&(k>=k1))   
            k--;   
            k++;   
            deq[k]=j;   
        }   
        for(j=b;j<=m;j++)   
        {   
            if(deq[k1]<=j-b)   
                k1++;   
            while((x[i][deq[k]]>=x[i][j])&&(k>=k1))   
                k--;   
            k++;   
            deq[k]=j;   
            a1[i][j]=x[i][deq[k1]];   
        }   
        k=1;   
        k1=1;   
        deq[1]=1;   
        for(j=1;j<b;j++)   
        {   
            while((x[i][deq[k]]<=x[i][j])&&(k>=k1))   
                k--;   
            k++;   
            deq[k]=j;   
        }   
        for(j=b;j<=m;j++)   
        {   
            if(deq[k1]<=j-b)   
                k1++;   
            while((x[i][deq[k]]<=x[i][j])&&(k>=k1))   
                k--;   
            k++;   
            deq[k]=j;   
            b1[i][j]=x[i][deq[k1]];   
        }   
    }
    for(i=b;i<=m;i++)   
    {   
        k=1;   
        k1=1;   
        deq[1]=1;   
        for(j=1;j<a;j++)   
        {   
            while((a1[deq[k]][i]>=a1[j][i])&&(k>=k1))  
                k--;   
            k++;   
            deq[k]=j;
        }   
        for(j=a;j<=n;j++)   
        {   
            if(deq[k1]<=j-a)   
                k1++;   
            while((a1[deq[k]][i]>=a1[j][i])&&(k>=k1))   
                k--;   
            k++;   
            deq[k]=j; 
            a2[j][i]=a1[deq[k1]][i];   
        }  
        k=1;   
        k1=1;   
        deq[1]=1;   
        for(j=1;j<a;j++)   
        {   
            while((b1[deq[k]][i]<=b1[j][i])&&(k>=k1))   
                k--;   
            k++;   
            deq[k]=j;   
        }   
        for(j=a;j<=n;j++)   
        {   
            if(deq[k1]<=j-a)   
                k1++;   
            while((b1[deq[k]][i]<=b1[j][i])&&(k>=k1))   
                k--;   
            k++;   
            deq[k]=j;   
            b2[j][i]=b1[deq[k1]][i];  
            if (b2[j][i]-a2[j][i]<min)
            {
                min=b2[j][i]-a2[j][i]; 
                num=0;
            }
            if (b2[j][i]-a2[j][i]==min)
            {
                num++;
            }
                
        }   
    } 
	}
    printf("%d %d\n",min,num);
    }
    return 0;
}