Cod sursa(job #2205276)

Utilizator dahaandreiDaha Andrei Codrin dahaandrei Data 18 mai 2018 17:26:46
Problema Struti Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.81 kb
#include <fstream>
#include <deque>

using namespace std;

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

const int MAXNM = 1e3;

int n, m, p, d1, d2;
int mat[MAXNM + 2][MAXNM + 2];

int abs(int nr) {
  if (nr < 0)
    return -nr;
  return nr;
}

pair <int, int> retMinMax(int dx, int dy) {
  struct ceva{
    int val;
    int poz;

    ceva (int _val = 0, int _poz = 0) {
      val = _val;
      poz = _poz;
    }
  }dq;

  int minim, maxim;
  minim = 8001, maxim = 0;
  int minDif = abs(maxim - minim);
  int cnt = 0;
  int minMat[n + 2][m + 2], maxMat[n + 2][m + 2];

  for (int i = 1; i <= n; ++ i) {
    deque <ceva>minDq;
    deque <ceva>maxDq;
    for (int j = 1; j <= m; ++ j) {
      dq.poz = j;
      dq.val = mat[i][j];

      if (!minDq.empty()) {
        while (minDq.back().val >= dq.val) {
          minDq.pop_back();
          if (minDq.empty())
            break;
        }
      }

      minDq.push_back(dq);

      while (minDq.front().poz <= dq.poz - dx)
        minDq.pop_front();

      minMat[i][j] = minDq.front().val;


      if (!maxDq.empty()) {
        while (maxDq.back().val <= dq.val) {
          maxDq.pop_back();
          if (maxDq.empty())
            break;
        }
      }

      maxDq.push_back(dq);

      while (maxDq.front().poz <= dq.poz - dx)
        maxDq.pop_front();

      maxMat[i][j] = maxDq.front().val;
    }
  }

  for (int i = dx; i <= m; ++ i) {
    deque <ceva>minDq;
    deque <ceva>maxDq;

    for (int j = 1; j < dy; ++ j) {
      ceva max_elem, min_elem;
      min_elem.poz = max_elem.poz = j;
      min_elem.val = minMat[j][i], max_elem.val = maxMat[j][i];

      if (!minDq.empty()) {
        while (minDq.back().val >= min_elem.val) {
          minDq.pop_back();
          if (minDq.empty())
            break;
        }
      }

      minDq.push_back(min_elem);

      if (!maxDq.empty()) {
        while (maxDq.back().val <= max_elem.val) {
          maxDq.pop_back();
          if (maxDq.empty())
            break;
        }
      }

      maxDq.push_back(max_elem);
    }

    for (int j = dy; j <= n; ++ j){
      ceva max_elem, min_elem;
      min_elem.poz = max_elem.poz = j;
      min_elem.val = minMat[j][i], max_elem.val = maxMat[j][i];

      if (!minDq.empty()) {
        while (minDq.back().val >= min_elem.val) {
          minDq.pop_back();
          if (minDq.empty())
            break;
        }
      }

      minDq.push_back(min_elem);

      while (minDq.front().poz <= min_elem.poz - dy)
        minDq.pop_front();


      if (!maxDq.empty()) {
        while (maxDq.back().val <= max_elem.val) {
          maxDq.pop_back();
          if (maxDq.empty())
            break;
        }
      }

      maxDq.push_back(max_elem);

      while (maxDq.front().poz <= max_elem.poz - dy)
        maxDq.pop_front();

      minim = minDq.front().val;
      maxim = maxDq.front().val;

      if (abs(maxim - minim) < minDif) {
        cnt = 1;
        minDif = abs(maxim - minim);
      }
      else if (abs(maxim - minim) == minDif)
        ++ cnt;

    }
  }

  return make_pair(minDif, cnt);
}

int main() {
  in >> n >> m >> p;

  for (int i = 1; i <= n; ++ i)
    for (int j = 1; j <= m; ++ j)
      in >> mat[i][j];

  while (p --) {
    in >> d1 >> d2;

    pair <int, int>rez;
    rez = retMinMax(d1, d2);
    pair <int, int>aux;
    aux = retMinMax(d2, d1);

    if (rez.first < aux.first)
      out << rez.first << ' ' << rez.second << '\n';
    if (rez.first == aux.first)
      if (d1 != d2)
        out << rez.first << ' ' << rez.second + aux.second << '\n';
      else
        out << rez.first << ' ' << rez.second << '\n';
    if (rez.first > aux.first)
      out << aux.first << ' ' << aux.second << '\n';
  }

  return 0;
}