Cod sursa(job #2674798)

Utilizator popashtefan10Popa Stefan popashtefan10 Data 20 noiembrie 2020 11:03:56
Problema Struti Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.28 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], minc[NMAX + 5][NMAX + 5], maxc[NMAX + 5][NMAX + 5];
int col_min[NMAX + 5], col_max[NMAX + 5];
int crt_min[NMAX + 5], crt_max[NMAX + 5];
int st0, dr0, st1, dr1, st2, dr2, st3, dr3;

void solve(int dx, int dy, int &min_dif, int &nrap) {
  min_dif = DIFMAX + 5;
  nrap = 0;

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

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

  for(int i = dx; i <= n; i++) {
    st2 = st3 = 0;
    dr2 = dr3 = -1;
    for(int j = 1; j <= m; j++) {
      if(dr2 >= st2 && crt_min[st2] == j - dy) st2++;
      while(dr2 >= st2 && minc[i][j] <= minc[i][crt_min[dr2]]) dr2--;
      crt_min[++dr2] = j;

      if(dr3 >= st3 && crt_max[st3] == j - dy) st3++;
      while(dr3 >= st3 && maxc[i][j] >= maxc[i][crt_max[dr3]]) dr3--;
      crt_max[++dr3] = j;

      if(j >= dy) {
        int dif = maxc[i][crt_max[st3]] - minc[i][crt_min[st2]];
        if(dif == min_dif) nrap++;
        else if(dif < min_dif) {
          min_dif = dif;
          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;
}