Cod sursa(job #1106348)

Utilizator ion824Ion Ureche ion824 Data 12 februarie 2014 18:50:51
Problema Struti Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.95 kb
#include<fstream>
#include<algorithm>
#include<string>
#include<cstring>
using namespace std;
const int NM = 1003;
const int INF = 0x3f3f3f3f;
int a[NM][NM],mx[NM][NM],mn[NM][NM],difmin,nr;
int dq1[NM],dq2[NM];
string s;

void deq(int DX,int DY,int N,int M){
     int i,j,t,aij,mxij,mnij;
     int m1,m2,pm1=0,pm2=0;
     
     for(i=1;i<=N;++i)
      {
        memcpy(dq1,a[i],sizeof(a[i]));
        m1=-INF; m2=INF;
        for(j=1;j<=M;++j)
        {
          aij=dq1[j];
          if(j<DX){
            if(aij > m1){ m1=aij; pm1=j; }
            if(aij < m2){ m2=aij; pm2=j; }  
                    }
          else
          { 
             if(aij > m1){ m1=aij; pm1=j; }
             
             if(pm1 == j-DX)
             {
               m1=-INF;
               for(t=j-DX+1;t<=j;++t)
                 if(dq1[t] > m1){ m1=dq1[t]; pm1=t; }
             }                               
             
             if(aij < m2){ m2=aij; pm2=j; }
                         
             if(pm2 == j-DX)
             {
               m2=INF;
               for(t=j-DX+1;t<=j;++t)
                 if(dq1[t] < m2){ m2=dq1[t]; pm2=t; }
             }                        
             
             mx[j][i]=m1;
             mn[j][i]=m2;
            }                
          } 
      }
      
      for(i=DX;i<=M;++i)
      {
        memcpy(dq1,mx[i],sizeof(mx[i]));
        memcpy(dq2,mn[i],sizeof(mn[i]));                
        m1=-INF; m2=INF;
        for(j=1;j<=N;++j)
        {
          mxij=dq1[j]; mnij=dq2[j];
          if(j<DY) 
          {
            if(mxij > m1){ m1=mxij; pm1=j; }
            if(mnij < m2){ m2=mnij; pm2=j; }       
          }
          else
          {
            if(mxij > m1){ m1=mxij; pm1=j; }

            if(j - DY == pm1)
            {
              m1=-INF;
              for(t=j-DY+1;t<=j;++t)
                if(dq1[t] > m1){ m1=dq1[t]; pm1=t; }     
            }
           
            if(mnij < m2){ m2=mnij; pm2=j; }

            if(j - DY == pm2)
            {
              m2=INF;
              for(t=pm2+1;t<=j;++t)
                if(dq2[t] < m2){ m2=dq2[t]; pm2=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,k,x,l,DX,DY;
    
    cin>>N>>M>>P; getline(cin,s);

    for(i=1;i<=N;++i)
    {
      getline(cin,s); j=k=0; l=s.length();
      while(j<l){
        while(j<l && s[j]!=' '){ x=(x*10)+(s[j]-'0'); ++j; }
        a[i][++k]=x; x=0; ++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;   
}