Cod sursa(job #2674787)

Utilizator popashtefan10Popa Stefan popashtefan10 Data 20 noiembrie 2020 10:15:07
Problema Struti Scor 90
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.54 kb
#include <iostream>
#include <cstdio>
#include <deque>

using namespace std;

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

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

int n, m, p;
int a[NMAX + 5][NMAX + 5];
int col_min[NMAX + 5][NMAX + 5], col_max[NMAX + 5][NMAX + 5];
poz crt_min[NMAX + 5], crt_max[NMAX + 5];
int st0[NMAX + 5], dr0[NMAX + 5], st1[NMAX + 5], dr1[NMAX + 5], st2, dr2, st3, dr3;

void solve(int dx, int dy, int &min_dif, int &nrap) {
  for(int j = 1; j <= m; ++j) {
    st0[j] = st1[j] = 0;
    dr0[j] = dr1[j] = -1;
  }
  min_dif = DIFMAX + 5;
  nrap = 0;

  for(int i = 1; i <= n; ++i) {
    st2 = st3 = 0;
    dr2 = dr3 = -1;

    for(int j = 1; j <= m; ++j) {
      if(dr0[j] >= st0[j] && col_min[j][st0[j]] == i - dx) ++st0[j];
      while(dr0[j] >= st0[j] && a[i][j] <= a[col_min[j][dr0[j]]][j]) --dr0[j];
      col_min[j][++dr0[j]] = i;
      int minim = col_min[j][st0[j]];

      if(dr1[j] >= st1[j] && col_max[j][st1[j]] == i - dx) ++st1[j];
      while(dr1[j] >= st1[j] && a[i][j] >= a[col_max[j][dr1[j]]][j]) --dr1[j];
      col_max[j][++dr1[j]] = i;
      int maxim = col_max[j][st1[j]];

      if(i >= dx) {
        if(dr2 >= st2 && crt_min[st2].j == j - dy) ++st2;
        while(dr2 >= st2 && a[minim][j] <= a[crt_min[dr2].i][crt_min[dr2].j]) --dr2;
        crt_min[++dr2].i = minim;
        crt_min[dr2].j = j;

        if(dr3 >= st3 && crt_max[st3].j == j - dy) ++st3;
        while(dr3 >= st3 && a[maxim][j] >= a[crt_max[dr3].i][crt_max[dr3].j]) --dr3;
        crt_max[++dr3].i = maxim;
        crt_max[dr3].j = j;
      }

      if(i >= dx && j >= dy) {
        minim = a[crt_min[st2].i][crt_min[st2].j];
        maxim = a[crt_max[st3].i][crt_max[st3].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(int i = 1; i <= n; ++i)
    for(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;
}