Cod sursa(job #1106216)

Utilizator ion824Ion Ureche ion824 Data 12 februarie 2014 17:26:22
Problema Struti Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.26 kb
#include<fstream>
#include<algorithm>
using namespace std;
const int NM = 1003;
const int INF = 0x3f3f3f3f;
int a[NM][NM],mx[NM][NM],mn[NM][NM],difmin,nr;

void deq(int DX,int DY,int N,int M){
     int i,j,t;
     int m1,n1,m2,n2,pm1=0,pm2=0,pn1=0,pn2=0;
     
     for(i=1;i<=N;++i)
      {
        m1=n1=-INF; m2=n2=INF;
        for(j=1;j<=M;++j)
          if(j<DX){
            if(a[i][j] > m1){ m1=a[i][j]; pm1=j; }
            else
            if(a[i][j] > n1){ n1=a[i][j]; pn1=j; }
            //
            if(a[i][j] < m2){ m2=a[i][j]; pm2=j; }
            else
            if(a[i][j] < n2){ n2=a[i][j]; pn2=j; }      
                    }
          else
          { 
             if(a[i][j] > m1){ m1=a[i][j]; pm1=j; }
             else
             if(a[i][j] > n1){ n1=a[i][j]; pn1=j; } 
             
             if(pm1 == j-DX)
             {
               m1=n1; pm1=pn1; n1=-INF;
               for(t=j-DX+1;t<=j;++t)
                 if(t!=pm1 && a[i][t] > n1){ n1=a[i][t]; pn1=t; }
             }                               
             
             if(a[i][j] < m2){ m2=a[i][j]; pm2=j; }
             else
             if(a[i][j] < n2){ n2=a[i][j]; pn2=j; }
                         
             if(pm2 == j-DX)
             {
               m2=n2; pm2=pn2; n2=INF;
               for(t=j-DX+1;t<=j;++t)
                 if(t!=pm2 && a[i][t] < n2){ n2=a[i][t]; pn2=t; }
             }                        
             
             mx[i][j]=m1;
             mn[i][j]=m2;
          }                
      } 
      
      for(j=DX;j<=M;++j)
      {
        m1=n1=-INF; m2=n2=INF;
        for(i=1;i<=N;++i)
          if(i<DY) 
          {
            if(mx[i][j] > m1){ m1=mx[i][j]; pm1=i; }
            else
            if(mx[i][j] > n1){ n1=mx[i][j]; pn1=i; }
            //
            if(mn[i][j] < m2){ m2=mn[i][j]; pm2=i; }
            else
            if(mn[i][j] < n2){ n2=mn[i][j]; pn2=i; }           
          }
          else
          {
            if(mx[i][j] > m1){ m1=mx[i][j]; pm1=i; }
            else
            if(mx[i][j] > n1){ n1=mx[i][j]; pn1=i; }
            if(i - DY == pm1)
            {
              m1=n1; pm1=pn1; n1=-INF;
              for(t=i-DY+1;t<=i;++t)
                if(t!=pm1 && mx[t][j] > n1){ n1=mx[t][j]; pn1=t; }     
            }
           
            if(mn[i][j] < m2){ m2=mn[i][j]; pm2=i; }
            else
            if(mn[i][j] < n2){ n2=mn[i][j]; pn2=i; }
            if(i - DY == pm2)
            {
              m2=n2; pm2=pn2; n2=INF;
              for(t=i-DY+1;t<=i;++t)
                if(t!=pm2 && mn[t][j] < n2){ n2=mn[t][j]; pn2=t; }    
            }         
            
            if(m1-m2==difmin)++nr;
            else
            if(m1 - m2 < difmin){ difmin=m1-m2; nr=1; }    
          }
        }
            
}


int main(){
    ifstream cin("struti.in");
    ofstream cout("struti.out");
    int N,M,P,i,j,DX,DY;
    
    cin>>N>>M>>P;
    for(i=1;i<=N;++i)
      for(j=1;j<=M;++j)
        cin>>a[i][j];
    
    while(P--){
      cin>>DX>>DY;
      
      difmin = INF; nr=0;
      deq(DX,DY,N,M);
      if(DX!=DY) deq(DY,DX,N,M);
      
      cout<<difmin<<' '<<nr<<'\n';     
    }
    
 return 0;   
}