Cod sursa(job #1106426)

Utilizator ion824Ion Ureche ion824 Data 12 februarie 2014 20:04:31
Problema Struti Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.16 kb
#include<fstream>
#include<algorithm>
#include<string>
using namespace std;
const int NM = 1003;
const int INF = 0x3f3f3f3f;
int a[NM][NM],mx[NM][NM],mn[NM][NM],difmin,nr;
int dq[NM],dq2[NM],pq[NM],pq2[NM];
string s;
 
void deq(int DX,int DY,int N,int M){
     int i,j,Front,F,Back,B;
      
     for(i=1;i<=N;++i)
      {
        Front=1; Back=0;
        F = 1; B = 0;
        for(j=1;j<=M;++j)
        {
          for(;Front <= Back && dq[Back]<=a[i][j];--Back);
          dq[++Back] = a[i][j]; pq[Back]=j;
          
          for(;F <= B && dq2[B]>=a[i][j];--B);
          dq2[++B] = a[i][j]; pq2[B]=j;
          
          if(j - pq[Front] >= DX) ++Front;
          
          if(j - pq2[F] >= DX) ++F;
          
          if(j >= DX) mx[j][i]=dq[Front];
              
          if(j >= DX) mn[j][i]=dq2[F];
                           
        } 
      }
       
      for(i=DX;i<=M;++i)
      {
        Front=1; Back=0;
        F = 1; B = 0;
        for(j=1;j<=N;++j)
        {
          for(;Front <= Back && dq[Back]<=mx[i][j];--Back);
          dq[++Back] = mx[i][j]; pq[Back]=j;
          
          for(;F <= B && dq2[B]>=mn[i][j];--B);
          dq2[++B] = mn[i][j]; pq2[B]=j;
          
          if(j-pq[Front] >= DY) ++Front;
          
          if(j-pq2[F] >= DY) ++F;
          
          if(j >= DY)
          {
            if(dq[Front]-dq2[F] == difmin) ++nr;
            else
            if(dq[Front]-dq2[F] < difmin){ difmin=dq[Front]-dq2[F]; 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;   
}