Cod sursa(job #2212978)

Utilizator Dobricean_IoanDobricean Ionut Dobricean_Ioan Data 15 iunie 2018 14:48:29
Problema Struti Scor 80
Compilator cpp Status done
Runda Teme Pregatire ACM Unibuc 2013 Marime 3.59 kb
#include <deque>
#include <fstream>
#include <cstring>
  
using namespace std;
  
ifstream fin ("struti.in");
ofstream fout ("struti.out");
  
const int Dim = 1001,Inf = 9000;
int n,m,p,mi,nr;
short A[Dim][Dim], M1[Dim][Dim],M2[Dim][Dim], m1[Dim][Dim],m2[Dim][Dim];
deque < int > D;
void Deq(int sizex,int sizey);
  
int main() {
      
    fin >> n >> m >> p;
    for ( int i = 1; i <= n; ++i)
        for ( int j = 1; j <= m; ++j)
            fin >> A[i][j];
        int x,y;
    for ( ; p > 0; --p)  {
            fin >> x >> y;
            mi = Inf;
            nr = 0;
            Deq(x,y);
            if ( y != x)
                Deq(y,x);
            fout << mi << " " << nr << "\n";
              
    }
}
  
void Deq(int sizex,int sizey) {
    D.clear();
    for ( int j = 1; j <= m; ++j) {
        D.push_front(1);
        M1[1][j] = A[1][j];
        for ( int i = 2; i <= sizex; ++i) {
            while(D.size() and A[D.back()][j] <= A[i][j])
                D.pop_back();
            D.push_back(i);
            M1[i][j] = A[D.front()][j];
            }
          
        for ( int i = sizex + 1; i <= n; ++i) { 
             while(D.size() and A[D.back()][j] <= A[i][j])
                    D.pop_back();
            D.push_back(i);
            while(D.size() and i - D.front() == sizex)
                D.pop_front();
            M1[i][j] = A[D.front()][j];
            }
        D.clear();
        }
    D.clear(); 
    for ( int i = 1; i <= n; ++i) {
        D.push_back(1);
        M2[i][1] = M1[i][1];
        for ( int j = 2; j <= sizey; ++j) {
            while(D.size() and M1[i][j] >= M1[i][D.back()] )
                D.pop_back();
            D.push_back(j);
            M2[i][j] = M1[i][D.front()];
            }
      
        for (int  j = sizey + 1 ; j <= m; ++j) {
            while ( D.size() and M1[i][j] >= M1[i][D.back()] )
                D.pop_back();
            D.push_back(j);
            while(D.size() and j - D.front() == sizey)
                D.pop_front();
            M2[i][j] = M1[i][D.front()];
            }
        D.clear();}
          
    D.clear();
    for ( int j = 1; j <= m; ++j) {
        D.push_front(1);
        m1[1][j] = A[1][j];
        for ( int i = 2; i <= sizex; ++i) {
            while(D.size() and A[D.back()][j] >= A[i][j])
                D.pop_back();
            D.push_back(i);
            m1[i][j] = A[D.front()][j];
            }
          
        for ( int i = sizex + 1; i <= n; ++i) { 
             while(D.size() and A[D.back()][j] >= A[i][j])
                    D.pop_back();
            D.push_back(i);
            while(D.size() and i - D.front() == sizex)
                D.pop_front();
            m1[i][j] = A[D.front()][j];
            }
        D.clear();}
    D.clear(); 
    for ( int i = 1; i <= n; ++i) {
        D.push_back(1);
        m2[i][1] = m1[i][1];
        for ( int j = 2; j <= sizey; ++j) {
            while(D.size() and m1[i][j] <= m1[i][D.back()] )
                D.pop_back();
            D.push_back(j);
            m2[i][j] = m1[i][D.front()];
            }
          
        for ( int j = sizey + 1; j <= m; ++j) {
            while ( D.size() and m1[i][j] <= m1[i][D.back()] )
                D.pop_back();
            D.push_back(j);
            while(D.size() and j - D.front() == sizey)
                D.pop_front();
            m2[i][j] = m1[i][D.front()];
            }
        D.clear();}
    for ( int i = sizex; i <= n; ++i)
        for ( int j = sizey; j <= m; ++j)
            if ( M2[i][j] - m2[i][j] < mi )
                mi = M2[i][j] - m2[i][j],nr = 1;
            else
                if ( M2[i][j] - m2[i][j] == mi)
                    ++nr;
}