Cod sursa(job #2429664)

Utilizator AlexPop28Pop Alex-Nicolae AlexPop28 Data 10 iunie 2019 20:23:45
Problema Struti Scor 90
Compilator cpp-64 Status done
Runda Teme Pregatire ACM Unibuc 2013 Marime 2.18 kb
#include <bits/stdc++.h>
#define DEBUG(x) cerr << (#x) << ": " << (x) << '\n'

using namespace std;

bool comp(int a, int b, int comp) {
  if (!comp) return a <= b;
  return a >= b;  
}

vector<int> getMinMax(int n, int delta, int type, vector<int> &v) {
  deque<int> dq;
  vector<int> ret(n + 2);
  for (int i = 1; i <= n; ++i) {
    while (!dq.empty() && dq.front() <= i - delta)  dq.pop_front();
    while (!dq.empty() && comp(v[i], v[dq.back()], type)) dq.pop_back();
    dq.push_back(i);
    ret[i] = v[dq.front()];
  }
  return ret;
}

pair<int, int> solve(int n, int m, int dx, int dy, vector<vector<int>> &a) {
  vector<vector<int>> min(m + 2, vector<int>(n + 2));
  vector<vector<int>> max(m + 2, vector<int>(n + 2));
  for (int row = 1; row <= n; ++row) {
    auto min_last = getMinMax(m, dx, 0, a[row]);
    auto max_last = getMinMax(m, dx, 1, a[row]);
    for (int col = 1; col <= m; ++col) {
      min[col][row] = min_last[col];
      max[col][row] = max_last[col];
    }
  }
  pair<int, int> ans = {(int)1e9, 0};
  for (int col = dx; col <= m; ++col) {
    auto min_last = getMinMax(n, dy, 0, min[col]);
    auto max_last = getMinMax(n, dy, 1, max[col]);
    for (int row = dy; row <= n; ++row) {
      if (ans.first > max_last[row] - min_last[row]) ans = {max_last[row] - min_last[row], 1};
      else if (ans.first == max_last[row] - min_last[row]) ++ans.second;
    }
  }
  return ans;
}

pair<int, int> join(pair<int, int> a, pair<int, int> b) {
  if (a.first != b.first) return min(a, b);
  return {a.first, a.second + b.second};  
}

int main() {
  freopen("struti.in", "r", stdin);
  freopen("struti.out", "w", stdout);
  ios::sync_with_stdio(0);
  cin.tie(0);

  int n, m, p;
  cin >> n >> m >> p;
  vector<vector<int>> a(n + 2, vector<int>(m + 2));
  for (int i = 1; i <= n; ++i) {
    for (int j = 1; j <= m; ++j) {
      cin >> a[i][j];
    }
  }
  while (p--) {
    int dx, dy;
    cin >> dx >> dy;
    pair<int, int> ans = solve(n, m, dx, dy, a);
    if (dx != dy) {
      ans = join(ans, solve(n, m, dy, dx, a));
    }
    cout << ans.first << ' ' << ans.second << '\n';
  }
  cout.flush();

#ifdef LOCAL_DEFINE
  cerr << "Time elapsed: " << 1.0 * clock() / CLOCKS_PER_SEC << " s.\n";
#endif
  return 0;
}