Cod sursa(job #1054309)

Utilizator BarracudaFMI-Alex Dobrin Barracuda Data 13 decembrie 2013 18:16:17
Problema Struti Scor 100
Compilator cpp Status done
Runda Teme Pregatire ACM Unibuc 2013 Marime 3.09 kb
#include<cstdio>
#include<cstring>
#define dim 1005
using namespace std;
  
int DX,DY;
short int A[dim][dim],MAX[dim][dim],MAX2[dim][dim],MINU[dim][dim],MINU2[dim][dim],deque[dim];int front,back,n,m,p,i,j,NR,MIN;
void check  (int DX,int DY ) {  
  
    for(j=1; j<=m; ++j ) {
          
        front=1;back=0;
          
        for( i=1 ; i<=n ; ++i ) {
              
              
            while(front <= back  && A[i][j]>A[deque[back]][j])
                --back;
              
            deque[++back]= i;
              
              
            if(deque[front]==i-DX)
                front++;
              
            if(i>=DX)
                MAX[i-DX+1][j]=A[deque[front]][j];
        }
    }
      
    for( i=1; i<=n; ++i) {
          
        front=1;back=0;
          
          
        for(  j=1 ;j<=m;  ++j) {
              
            while(front <= back && MAX[i][j]>MAX[i][deque[back]])
                --back;
              
            deque[++back]=j;
              
            if(deque[front]==j-DY)
                ++front;
              
            if(j>=DY)
                MAX2[i][j-DY+1]=MAX[i][deque[front]];
              
        }
          
    }
    for(j=1; j<=m; ++j ) {
          
        front=1;back=0;
          
          
        for( i=1 ; i<=n ; ++i ) {
              
              
            while(front <= back  && A[i][j]<A[deque[back]][j])
                --back;
              
            deque[++back]=i;
              
              
            if(deque[front]==i-DX)
                front++;
              
            if(i>=DX)
                MINU[i-DX+1][j]=A[deque[front]][j];
        }
    }
      
    for( i=1; i<=n; ++i) {
          
        front=1;back=0;
          
          
        for(  j=1 ;j<=m;  ++j) {
              
            while(front <= back && MINU[i][j]<MINU[i][deque[back]])
                --back;
              
            deque[++back]=j;
              
            if(deque[front]==j-DY)
                ++front;
              
            if(j>=DY)
                MINU2[i][j-DY+1]=MINU[i][deque[front]];
              
        }
          
    }
    for(i=1;i<=n-DX+1;++i) {
          
        for(j=1;j<=m-DY+1; ++j ) {
              
            if(MIN>MAX2[i][j]-MINU2[i][j]){
                MIN=MAX2[i][j]-MINU2[i][j];
                NR=1;
            }
            else
                if(MIN==MAX2[i][j]-MINU2[i][j])
                    NR++;
              
        }
          
    }
}   
  
  
  
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",&A[i][j]);
      
    for(;p;--p) {
        scanf("%d%d",&DX,&DY);
        MIN=0x3f3f3f3f;
          
        check(DX,DY);
          
        if(DX!=DY){
              
              
            check(DY,DX);
        }
        printf("%d %d\n",MIN,NR);
    }
      
      
      
      
    return 0;
}