Cod sursa(job #2429670)

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

using namespace std;

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

inline void getMinMax(int n, int delta, int type, vector<int> &v, vector<int> &ret) {
  deque<int> dq;
  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()];
  }
}

inline 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));
  vector<int> min_last(m + 2), max_last(m + 2);
  for (int row = 1; row <= n; ++row) {
    getMinMax(m, dx, 0, a[row], min_last);
    getMinMax(m, dx, 1, a[row], max_last);
    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};
  min_last.resize(n + 2);
  max_last.resize(n + 2);
  for (int col = dx; col <= m; ++col) {
    getMinMax(n, dy, 0, min[col], min_last);
    getMinMax(n, dy, 1, max[col], max_last);
    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;
  scanf("%d%d%d", &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) {
      scanf("%d", &a[i][j]);
    }
  }
  while (p--) {
    int dx, dy;
    scanf("%d%d", &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;
}