Cod sursa(job #914025)

Utilizator FayedStratulat Alexandru Fayed Data 13 martie 2013 21:12:33
Problema Struti Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.98 kb
#include <cstdio>
#include <deque>
#define NMAX 1001
using namespace std;

deque < int > maxDeque,minDeque;
int M[NMAX][NMAX],Min[NMAX][NMAX],Max[NMAX][NMAX];
int n,m,P,L,C,nr,Difmin;

inline void citesc(){

    freopen("struti.in","r",stdin);
    freopen("struti.out","w",stdout);
    scanf("%d%d%d",&n,&m,&P);
    for(register int i=1;i<=n;++i)
        for(register int j=1;j<=m;++j)
            scanf("%d",&M[i][j]);
}

inline void Submat(int L,int C){

    while(!minDeque.empty())
        minDeque.pop_front();
    while(!maxDeque.empty())
        maxDeque.pop_front();

    for(register int i=1;i<=n;++i){

     while(!minDeque.empty())
        minDeque.pop_front();
    while(!maxDeque.empty())
        maxDeque.pop_front();

            for(register int j=1;j<=m;++j){

                while(!minDeque.empty() && M[i][j] <= M[i][minDeque.back()])
                    minDeque.pop_back();
                    minDeque.push_back(j);


                while(!maxDeque.empty() && M[i][j] >= M[i][maxDeque.back()])
                    maxDeque.pop_back();
                    maxDeque.push_back(j);

                 if(minDeque.front()+C ==j)
                    minDeque.pop_front();
                if(maxDeque.front()+C == j)
                    maxDeque.pop_front();

                if(j>=C){
                    Min[i][j] = M[i][minDeque.front()];
                    Max[i][j] = M[i][maxDeque.front()];
                }
          }
     }

        for(register int j=C;j<=m;++j){

             while(!minDeque.empty())
                minDeque.pop_front();
            while(!maxDeque.empty())
                maxDeque.pop_front();

            for(register int i=1;i<=n;++i){

                while(!minDeque.empty() && Min[i][j] <= Min[minDeque.back()][j])
                    minDeque.pop_back();
                    minDeque.push_back(i);

                  while(!maxDeque.empty() && Max[i][j] >= Max[maxDeque.back()][j])
                    maxDeque.pop_back();
                    maxDeque.push_back(i);

                if(minDeque.front()+L == i)
                    minDeque.pop_front();
                 if(maxDeque.front()+L == i)
                    maxDeque.pop_front();

                   if(i>=L){
                        if(Max[maxDeque.front()][j]-Min[minDeque.front()][j] < Difmin){
                            Difmin = Max[maxDeque.front()][j]-Min[minDeque.front()][j];
                            nr=1;
                        }
                   else if(Max[maxDeque.front()][j]-Min[minDeque.front()][j] == Difmin)
                        ++nr;
                        }
                }
        }
}

inline void write(){

    while(P){

        Difmin = 0x3f3f3f3f;
        nr=0;
        scanf("%d%d",&L,&C);
            Submat(L,C);
                if(L!=C)
                    Submat(C,L);
        printf("%d %d\n",Difmin,nr);
        --P;
    }
}

int main(){

    citesc();
    write();

return 0;
}