Cod sursa(job #1043146)

Utilizator BarracudaFMI-Alex Dobrin Barracuda Data 28 noiembrie 2013 01:31:23
Problema Struti Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.03 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;
}