Cod sursa(job #2135361)

Utilizator cella.florescuCella Florescu cella.florescu Data 18 februarie 2018 19:35:31
Problema Struti Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.13 kb
#include <bits/stdc++.h>

using namespace std;

const int MAXN = 1e3;

int mat[MAXN][MAXN], mn[MAXN][MAXN], mx[MAXN][MAXN], deqmn[MAXN], deqmx[MAXN];

inline void check_deq(int deq[], int &b, int e, int lim) {
  if (b <= e && deq[b] == lim)
    ++b;
}

pair <int, int> diff_min(int h, int w, int m, int n) {
  int bmx, emx, bmn, emn, ans = INT_MAX, nr = 0;
  for (int i = 0; i < m; ++i) {
    bmx = bmn = 0; emx = emn = -1;
    for (int j = 0; j < n; ++j) {
      check_deq(deqmx, bmx, emx, j - w);
      check_deq(deqmn, bmn, emn, j - w);
      while (bmx <= emx && mat[i][j] > mat[i][deqmx[emx]])
        --emx;
      while (bmn <= emn && mat[i][j] < mat[i][deqmn[emn]])
        --emn;
      deqmx[++emx] = deqmn[++emn] = j;
      mx[i][j] = mat[i][deqmx[bmx]];
      mn[i][j] = mat[i][deqmn[bmn]];
    }
  }
  for (int j = 0; j < n; ++j) {
    bmx = bmn = 0; emx = emn = -1;
    for (int i = 0; i < m; ++i) {
      check_deq(deqmx, bmx, emx, i - h);
      check_deq(deqmn, bmn, emn, i - h);
      while (bmx <= emx && mx[i][j] > mx[deqmx[emx]][j])
        --emx;
      while (bmn <= emn && mn[i][j] < mn[deqmn[emn]][j])
        --emn;
      deqmx[++emx] = deqmn[++emn] = i;
      if (i > h - 2 && j > w - 2) {
        if (ans > mx[deqmx[bmx]][j] - mn[deqmn[bmn]][j]) {
          ans = mx[deqmx[bmx]][j] - mn[deqmn[bmn]][j];
          nr = 1;
        } else if (ans == mx[deqmx[bmx]][j] - mn[deqmn[bmn]][j])
          ++nr;
      }
    }
  }
  return {ans, nr};
}

int main()
{
    int n, m, p;
    ifstream fin("struti.in");
    fin >> m >> n >> p;
    for (int i = 0; i < m; ++i)
      for (int j = 0; j < n; ++j)
        fin >> mat[i][j];
    ofstream fout("struti.out");
    for (int i = 0; i < p; ++i) {
      int x, y;
      fin >> x >> y;
      auto a1 = diff_min(x, y, m, n), a2 = diff_min(y, x, m, n);
      if (x == y) {
        x = a1.first;
        y = a1.second;
      } else {
        x = min(a1.first, a2.first);
        y = (a1.first == x) * a1.second + (a2.first == x) * a2.second;
      }
      fout << x << " " << y << '\n';
    }
    fin.close();
    fout.close();
    return 0;
}