Cod sursa(job #3352898)

Utilizator ArseniuVictorStefanArseniu Victor Stefan ArseniuVictorStefan Data 2 mai 2026 13:45:52
Problema Struti Scor 100
Compilator cpp-64 Status done
Runda cerc-acs-02-05-26 Marime 1.84 kb
#include <bits/stdc++.h>

#define MMAX 1000
#define NMAX 1000

using namespace std;

int m, n, p, a[MMAX][NMAX];
deque<pair<int, int>> minCols[NMAX], maxCols[NMAX];

void insert(deque<pair<int, int>> &deq, int i, int x,
            const int &(*fn)(const int &, const int &)) {
  while (!deq.empty() && fn(x, deq.back().second) == x) {
    deq.pop_back();
  }

  deq.emplace_back(i, x);
}

void erase(deque<pair<int, int>> &deq, int i) {
  while (!deq.empty() && deq.front().first <= i) {
    deq.pop_front();
  }
}

void solve(int dx, int dy, int &mini, int &nr) {
  for (int i = 0; i < m; i++) {
    for (int j = 0; j < n; j++) {
      erase(minCols[j], i - dx);
      erase(maxCols[j], i - dx);

      insert(minCols[j], i, a[i][j], min<int>);
      insert(maxCols[j], i, a[i][j], max<int>);
    }

    if (i >= dx - 1) {
      deque<pair<int, int>> minLine, maxLine;
      for (int j = 0; j < n; j++) {
        erase(minLine, j - dy);
        erase(maxLine, j - dy);

        insert(minLine, j, minCols[j].front().second, min<int>);
        insert(maxLine, j, maxCols[j].front().second, max<int>);

        if (j >= dy - 1) {
          int crt = maxLine.front().second - minLine.front().second;
          if (crt < mini) {
            mini = crt;
            nr = 1;
          } else if (crt == mini) {
            nr++;
          }
        }
      }
    }
  }

  for (int j = 0; j < n; j++) {
    minCols[j].clear();
    maxCols[j].clear();
  }
}

int main() {
  ifstream cin("struti.in");
  ofstream cout("struti.out");

  cin >> m >> n >> p;

  for (int i = 0; i < m; i++) {
    for (int j = 0; j < n; j++) {
      cin >> a[i][j];
    }
  }

  for (int i = 0; i < p; i++) {
    int dx, dy;
    cin >> dx >> dy;

    int mini = 8001, nr = 0;
    solve(dx, dy, mini, nr);
    if (dx != dy)
      solve(dy, dx, mini, nr);

    cout << mini << " " << nr << "\n";
  }

  return 0;
}