Cod sursa(job #2674763)

Utilizator popashtefan10Popa Stefan popashtefan10 Data 20 noiembrie 2020 09:25:01
Problema Struti Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.6 kb
#include <iostream>
#include <cstdio>
#include <deque>

using namespace std;

struct poz {
  short int i, j;
  poz(short int _i = 0, short int _j = 0) : i(_i), j(_j) {}
};

const short int NMAX = 1000;
const short int DIFMAX = 8000;

short int n, m, p;
short int a[NMAX + 5][NMAX + 5];
deque<short int> col_min[NMAX + 5], col_max[NMAX + 5];
deque<poz> crt_min, crt_max;

void solve(int dx, int dy, int &min_dif, int &nrap) {
  for(short int j = 1; j <= m; j++) {
    col_min[j].clear();
    col_max[j].clear();
  }
  min_dif = DIFMAX + 5;
  nrap = 0;

  for(short int i = 1; i <= n; i++) {
    crt_min.clear();
    crt_max.clear();

    for(short int j = 1; j <= m; j++) {
      if(!col_min[j].empty() && col_min[j].front() == i - dx) col_min[j].pop_front();
      while(!col_min[j].empty() && a[i][j] <= a[col_min[j].back()][j]) col_min[j].pop_back();
      col_min[j].push_back(i);
      short int minim = col_min[j].front();

      if(!col_max[j].empty() && col_max[j].front() == i - dx) col_max[j].pop_front();
      while(!col_max[j].empty() && a[col_max[j].back()][j] <= a[i][j]) col_max[j].pop_back();
      col_max[j].push_back(i);
      short int maxim = col_max[j].front();

      if(!crt_min.empty() && crt_min.front().j == j - dy) crt_min.pop_front();
      while(!crt_min.empty() && a[crt_min.back().i][crt_min.back().j] >= a[minim][j]) crt_min.pop_back();
      crt_min.push_back(poz(minim, j));

      if(!crt_max.empty() && crt_max.front().j == j - dy) crt_max.pop_front();
      while(!crt_max.empty() && a[crt_max.back().i][crt_max.back().j] <= a[maxim][j]) crt_max.pop_back();
      crt_max.push_back(poz(maxim, j));

      if(i >= dx && j >= dy) {
        minim = a[crt_min.front().i][crt_min.front().j];
        maxim = a[crt_max.front().i][crt_max.front().j];
        if(maxim - minim == min_dif) nrap++;
        else if(maxim - minim < min_dif) {
          min_dif = maxim - minim;
          nrap = 1;
        }
      }
    }
  }
}

int main() {
  freopen("struti.in", "r", stdin);
  freopen("struti.out", "w", stdout);

  scanf("%d %d %d", &n, &m, &p);
  for(short int i = 1; i <= n; i++)
    for(short int j = 1; j <= m; j++)
      scanf("%d", &a[i][j]);

  int l1, l2, dif1, dif2;
  int n1, n2;
  while(p--) {
    scanf("%d", &l1);
    scanf("%d", &l2);

    dif1 = dif2 = DIFMAX + 5;
    n1 = n2 = 0;
    solve(l1, l2, dif1, n1);
    if(l2 != l1)
      solve(l2, l1, dif2, n2);
    if(dif1 == dif2)
      printf("%d %d\n", dif1, n1 + n2);
    else
      printf("%d %d\n", (dif1 < dif2) ? dif1 : dif2, (dif1 < dif2) ? n1 : n2);
  }

  return 0;
}