Cod sursa(job #2091272)

Utilizator cella.florescuCella Florescu cella.florescu Data 19 decembrie 2017 14:22:57
Problema Struti Scor 50
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];

pair <int, int> diff_min(int h, int w, int n, int m) {
  int bmx, emx, bmn, emn, ans = INT_MAX, nr = 0;
  for (int i = 0; i < n; ++i) {
    bmx = bmn = 0; emx = emn = -1;
    for (int j = 0; j < m; ++j) {
      if (bmx <= emx && deqmx[bmx] == j - w)
        ++bmx;
      if (bmn <= emn && deqmn[bmn] == j - w)
        ++bmn;
      while (bmx <= emx && mat[i][j] > mat[i][deqmx[emx]])
        --emx;
      while (bmn <= emn && mat[i][j] < mat[i][deqmn[emn]])
        --emn;
      deqmx[++emx] = j;
      deqmn[++emn] = j;
      mx[i][j] = mat[i][deqmx[bmx]];
      mn[i][j] = mat[i][deqmn[bmn]];
    }
  }
  for (int j = 0; j < m; ++j) {
    bmx = bmn = 0; emx = emn = -1;
    for (int i = 0; i < n; ++i) {
      if (bmx <= emx && deqmx[bmx] == i - h)
        ++bmx;
      if (bmn <= emn && deqmn[bmn] == i - h)
        ++bmn;
      while (bmx <= emx && mx[i][j] > mx[deqmx[emx]][j])
        --emx;
      while (bmn <= emn && mn[i][j] < mn[deqmn[emn]][j])
        --emn;
      deqmx[++emx] = i;
      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 >> n >> m >> p;
    for (int i = 0; i < n; ++i)
      for (int j = 0; j < m; ++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, n, m), a2 = diff_min(y, x, n, m);
      if (x == y)
        y = -a1.first;
      else
        y = 0;
      x = min(a1.first, a2.first);
      if (a1.first == x)
        y += a1.second;
      if (a2.first == x)
        y += a2.second;
      fout << x << " " << y << '\n';
    }
    fin.close();
    fout.close();
    return 0;
}