Cod sursa(job #1355928)

Utilizator StarGold2Emanuel Nrx StarGold2 Data 23 februarie 2015 01:14:46
Problema Struti Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.51 kb
#include <fstream>
#define DIM 1001
using namespace std;

ifstream fin ("struti.in" );
ofstream fout("struti.out");

int N, M, i, j, k, ok, minim, P, p;
int A[DIM][DIM], val , u, deque[DIM];
int D1Min[DIM][DIM], D2Min[DIM][DIM];
int D1Max[DIM][DIM], D2Max[DIM][DIM];
int DX, DY, t, nr, aux;

void Set_Up(){
     fin >> N >> M >> P;
     for(i = 1; i <= N; i ++)
          for(j = 1; j <= M; j ++)
               fin >> A[i][j];
     return;
}

void Deque_1_Min(){
     for(i = 1; i <= N; i ++){
          /*
               FAC DEQUE PT FIECARE LINIE
                  IN PARTE A MATRICII A
          */
          deque[1] = 1; p = u = 1; t = 0;
          for(j = 2; j <= M; j ++){
               while(p <= u && A[i][j] < A[i][deque[u]])
                    u --;
               u ++; deque[u] = j;
               if(j - deque[p] == DY)
                    p ++;
               if(j >= DY)
                    D1Min[i][++t] = A[i][deque[p]];
          }
     }
     return;
}

void Deque_2_Min(){
     for(j = 1; j <= M; j ++){
          /*
               FAC DEQUE PT FIECARE COLOANA
                IN PARTE A MATRICII D1Min
          */
          deque[1] = 1; p = u = 1; t = 0;
          for(i = 2; i <= N; i ++){
               while(p <= u && D1Min[i][j] < D1Min[deque[u]][j])
                    u --;
               u ++; deque[u] = i;
               if(i - deque[p] == DX)
                    p ++;
               if(i >= DX)
                    D2Min[++t][j] = D1Min[deque[p]][j];
          }
     }
     return;
}

void Deque_1_Max(){
     for(i = 1; i <= N; i ++){
          /*
               FAC DEQUE PT FIECARE LINIE
                  IN PARTE A MATRICII A
          */
          deque[1] = 1; p = u = 1; t = 0;
          for(j = 2; j <= M; j ++){
               while(p <= u && A[i][j] > A[i][deque[u]])
                    u --;
               u ++; deque[u] = j;
               if(j - deque[p] == DY)
                    p ++;
               if(j >= DY)
                    D2Max[i][++t] = A[i][deque[p]];
          }
     }
     return;
}

void Deque_2_Max(){
     for(j = 1; j <= M; j ++){
          /*
               FAC DEQUE PT FIECARE COLOANA
                IN PARTE A MATRICII D1Max
          */
          deque[1] = 1; p = u = 1; t = 0;
          for(i = 2; i <= N; i ++){
               while(p <= u && D1Max[i][j] > D1Max[deque[u]][j])
                    u --;
               u ++; deque[u] = i;
               if(i - deque[p] == DX)
                    p ++;
               if(i >= DX)
                    D2Max[++t][j] = D1Max[deque[p]][j];
          }
     }
     return;
}

void Search(){
     for(i = 1; i <= N - DX + 1; i ++)
          for(j = 1; j <= M - DY + 1; j ++)
               if(D2Max[i][j] - D2Min[i][j] < minim){
                    minim = D2Max[i][j] - D2Min[i][j];
                    nr = 1;
               }
               else
                    if(D2Max[i][j] - D2Min[i][j] == minim)
                         nr ++;
     return;
}

void Querys(){
     for(k = 1; k <= P; k ++){
          fin >> DX >> DY;
          minim = 2000000000;
          Deque_1_Min(); Deque_2_Min();
          Deque_1_Max(); Deque_2_Max();
          Search();
          aux = DX; DX = DY; DY = aux;
          Deque_1_Min(); Deque_2_Min();
          Deque_1_Max(); Deque_2_Max();
          Search();
          fout << minim << " " << nr << "\n";
     }
     return;
}

int main(){
     Set_Up();
     Querys();
     return 0;
}