Cod sursa(job #2590090)

Utilizator iancupoppPopp Iancu Alexandru iancupopp Data 27 martie 2020 15:06:15
Problema Struti Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.62 kb
#include <fstream>

using namespace std;

ifstream in ("struti.in");
ofstream out ("struti.out");

const int VM = 1e3;
short int v [VM + 1] [VM + 1];
short int minl [VM + 1] [VM + 1], maxl [VM + 1] [VM + 1];
short int minc [VM + 1] [VM + 1], maxc [VM + 1] [VM + 1];
short int dmin [VM + 1], dmax [VM + 1];
int nl, nc, x, y;

void citeste () {
  for (int i = 1; i <= nl; i ++)
    for (int j = 1; j <= nc; j ++)
      in >> v [i] [j];
}

void minime_linie () {
  int st, dr;
  for (int i = 1; i <= nl; i ++) {
    st = 1; dr = 0;
    for (int j = 1; j <= nc; j ++) {
      if (st <= dr && j - dmin [st] == x)
        st ++;
      while (st <= dr && v [i] [j] <= v [i] [dmin [dr]])
        dr --;
      dmin [++ dr] = j;
      if (j >= x)
        minl [i] [j] = v [i] [dmin [st]];
    }
  }
}

void maxime_linie () {
  int st, dr;
  for (int i = 1; i <= nl; i ++) {
    st = 1; dr = 0;
    for (int j = 1; j <= nc; j ++) {
      if (st <= dr && j - dmax [st] == x)
        st ++;
      while (st <= dr && v [i] [j] >= v [i] [dmax [dr]])
        dr --;
      dmax [++ dr] = j;
      if (j >= x)
        maxl [i] [j] = v [i] [dmax [st]];
    }
  }
}

void minime_coloana () {
  int st, dr;
  for (int j = x; j <= nc; j ++) {
    st = 1; dr = 0;
    for (int i = 1; i <= nl; i ++) {
      if (st <= dr && i - dmin [st] == y)
        st ++;
      while (st <= dr && minl [i] [j] <= minl [dmin [dr]] [j])
        dr --;
      dmin [++ dr] = i;
      if (i >= y)
        minc [i] [j] = minl [dmin [st]] [j];
    }
  }
}

void maxime_coloana () {
  int st, dr;
  for (int j = x; j <= nc; j ++) {
    st = 1; dr = 0;
    for (int i = 1; i <= nl; i ++) {
      if (st <= dr && i - dmax [st] == y)
        st ++;
      while (st <= dr && maxl [i] [j] >= maxl [dmax [dr]] [j])
        dr --;
      dmax [++ dr] = i;
      if (i >= y)
        maxc [i] [j] = maxl [dmax [st]] [j];
    }
  }
}

int main () {
  int nt, dif, difmin, nr;
  in >> nl >> nc >> nt;
  citeste ();
  for (int ct1 = 1; ct1 <= nt; ct1 ++) {
    in >> x >> y;
    difmin = 1 << 30;
    for (int ct2 = 1; ct2 <= 2; ct2 ++) {
      minime_linie ();
      minime_coloana ();
      maxime_linie ();
      maxime_coloana ();
      for (int i = y; i <= nl; i ++)
        for (int j = x; j <= nc; j ++) {
          dif = maxc [i] [j] - minc [i] [j];
          if (dif < difmin) {
            difmin = dif;
            nr = 1;
          }
          else if (dif == difmin)
            nr ++;
        }
      if (x == y)
        ct2 = 3;
      swap (x, y);
    }
    out << difmin << ' ' << nr << '\n';
  }
  return 0;
}