Problem p03056 (C++)

Buggy submission (status: Runtime Error):
/*
Author: QAQAutomaton
Lang: C++
Code: D.cpp
Mail: lk@qaq-am.com
Blog: https://www.qaq-am.com/
*/
#include <bits/stdc++.h>
#define debug(...) fprintf(stderr, __VA_ARGS__)
#define DEBUG printf("Passing [%s] in LINE %d\n", __FUNCTION__, __LINE__)
#define Debug debug("Passing [%s] in LINE %d\n", __FUNCTION__, __LINE__)
#define all(x) x.begin(), x.end()
#define x first
#define y second
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef complex<double> cp;
typedef pair<int, int> pii;
int inf;
const double eps = 1e-8;
const double pi = acos(-1.0);
template <class T> int chkmin(T &a, T b) { return a > b ? a = b, 1 : 0; }
template <class T> int chkmax(T &a, T b) { return a < b ? a = b, 1 : 0; }
template <class T> T sqr(T a) { return a * a; }
template <class T, class T2> T mmin(T a, T2 b) { return a < b ? a : b; }
template <class T, class T2> T mmax(T a, T2 b) { return a > b ? a : b; }
template <class T> T aabs(T a) { return a < 0 ? -a : a; }
template <class T> int dcmp(T a, T b) { return a > b; }
template <int *a> int cmp_a(int x, int y) { return a[x] < a[y]; }
#define min mmin
#define max mmax
#define abs aabs
struct __INIT__ {
  __INIT__() { memset(&inf, 0x3f, sizeof(inf)); }
} __INIT___;
namespace io {
const int SIZE = (1 << 21) + 1;
char ibuf[SIZE], *iS, *iT, obuf[SIZE], *oS = obuf, *oT = oS + SIZE - 1, c,
                                       qu[55];
int f, qr;
// getchar
#define gc()                                                                   \
  (iS == iT ? (iT = (iS = ibuf) + fread(ibuf, 1, SIZE, stdin),                 \
               (iS == iT ? EOF : *iS++))                                       \
            : *iS++)
// print the remaining part
inline void flush() {
  fwrite(obuf, 1, oS - obuf, stdout);
  oS = obuf;
}
// putchar
inline void putc(char x) {
  *oS++ = x;
  if (oS == oT)
    flush();
}
template <typename A> inline bool read(A &x) {
  for (f = 1, c = gc(); c < '0' || c > '9'; c = gc())
    if (c == '-')
      f = -1;
    else if (c == EOF)
      return 0;
  for (x = 0; c <= '9' && c >= '0'; c = gc())
    x = x * 10 + (c & 15);
  x *= f;
  return 1;
}
inline bool read(char &x) {
  while ((x = gc()) == ' ' || x == '\n' || x == '\r')
    ;
  return x != EOF;
}
inline bool read(char *x) {
  while ((*x = gc()) == '\n' || *x == ' ' || *x == '\r')
    ;
  if (*x == EOF)
    return 0;
  while (!(*x == '\n' || *x == ' ' || *x == '\r' || *x == EOF))
    *(++x) = gc();
  *x = 0;
  return 1;
}
template <typename A, typename... B> inline bool read(A &x, B &...y) {
  return read(x) && read(y...);
}
template <typename A> inline bool write(A x) {
  if (!x)
    putc('0');
  if (x < 0)
    putc('-'), x = -x;
  while (x)
    qu[++qr] = x % 10 + '0', x /= 10;
  while (qr)
    putc(qu[qr--]);
  return 0;
}
inline bool write(char x) {
  putc(x);
  return 0;
}
inline bool write(const char *x) {
  while (*x) {
    putc(*x);
    ++x;
  }
  return 0;
}
inline bool write(char *x) {
  while (*x) {
    putc(*x);
    ++x;
  }
  return 0;
}
template <typename A, typename... B> inline bool write(A x, B... y) {
  return write(x) || write(y...);
}
// no need to call flush at the end manually!
struct Flusher_ {
  ~Flusher_() { flush(); }
} io_flusher_;
} // namespace io
using io ::putc;
using io ::read;
using io ::write;
unsigned char f[200000005];
int n, m, s1, s2;
int x[205][205], y[205][205];
int s[205][205];
char str[205];
unsigned char w = -1, I = 1;
int dp(int xl, int xr, int yl, int yr) {
  unsigned char &cal = f[x[xl][xr] + y[yl][yr]];
  if (cal ^ w)
    return cal;
  int w = s[xr][yr] - s[xl - 1][yr] - s[xr][yl - 1] + s[xl - 1][yl - 1];
  //	write(xl,' ',xr,' ',yl,' ',yr,' ',w,'\n');
  if (!w || w == (xr - xl + 1) * (yr - yl + 1))
    return cal = 0;
  if (xl != xr) {
    int l = xl, r = xr - 1, mid;
    while (l <= r) {
      mid = (l + r) >> 1;
      unsigned char f1 = dp(xl, mid, yl, yr), f2 = dp(mid + 1, xr, yl, yr);
      chkmin(cal, (unsigned char)(max(f1, f2) + 1));
      if (f1 > f2)
        r = mid - 1;
      else if (f1 < f2)
        l = mid + 1;
      else
        break;
    }
  }
  if (yl != yr) {
    int l = yl, r = yr - 1, mid;
    while (l <= r) {
      mid = (l + r) >> 1;
      unsigned char f1 = dp(xl, xr, yl, mid), f2 = dp(xl, xr, mid + 1, yr);
      chkmin(cal, (unsigned char)(max(f1, f2) + 1));
      if (f1 > f2)
        r = mid - 1;
      else if (f1 < f2)
        l = mid + 1;
      else
        break;
    }
  }
  return cal;
}
signed main() {
#ifdef QAQAutoMaton
  freopen("D.in", "r", stdin);
  freopen("D.out", "w", stdout);
#endif
  read(n, m);
  for (int i = 1; i <= m; ++i)
    for (int j = i; j <= m; ++j) {
      y[i][j] = s2;
      ++s2;
    }
  for (int i = 1; i <= n; ++i)
    for (int j = i; j <= n; ++j) {
      x[i][j] = s1;
      s1 += s2;
    }
  for (int i = 0; i < s1; ++i)
    f[i] = w;
  for (int i = 1; i <= n; ++i) {
    read(str + 1);
    for (int j = 1; j <= m; ++j) {
      s[i][j] = s[i - 1][j] + s[i][j - 1] - s[i - 1][j - 1] + (str[j] == '#');
    }
  }
  write(dp(1, n, 1, m), '\n');
  return 0;
}


Fixed submission:
/*
Author: QAQAutomaton
Lang: C++
Code: D.cpp
Mail: lk@qaq-am.com
Blog: https://www.qaq-am.com/
*/
#include <bits/stdc++.h>
#define debug(...) fprintf(stderr, __VA_ARGS__)
#define DEBUG printf("Passing [%s] in LINE %d\n", __FUNCTION__, __LINE__)
#define Debug debug("Passing [%s] in LINE %d\n", __FUNCTION__, __LINE__)
#define all(x) x.begin(), x.end()
#define x first
#define y second
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef complex<double> cp;
typedef pair<int, int> pii;
int inf;
const double eps = 1e-8;
const double pi = acos(-1.0);
template <class T> int chkmin(T &a, T b) { return a > b ? a = b, 1 : 0; }
template <class T> int chkmax(T &a, T b) { return a < b ? a = b, 1 : 0; }
template <class T> T sqr(T a) { return a * a; }
template <class T, class T2> T mmin(T a, T2 b) { return a < b ? a : b; }
template <class T, class T2> T mmax(T a, T2 b) { return a > b ? a : b; }
template <class T> T aabs(T a) { return a < 0 ? -a : a; }
template <class T> int dcmp(T a, T b) { return a > b; }
template <int *a> int cmp_a(int x, int y) { return a[x] < a[y]; }
#define min mmin
#define max mmax
#define abs aabs
struct __INIT__ {
  __INIT__() { memset(&inf, 0x3f, sizeof(inf)); }
} __INIT___;
namespace io {
const int SIZE = (1 << 21) + 1;
char ibuf[SIZE], *iS, *iT, obuf[SIZE], *oS = obuf, *oT = oS + SIZE - 1, c,
                                       qu[55];
int f, qr;
// getchar
#define gc()                                                                   \
  (iS == iT ? (iT = (iS = ibuf) + fread(ibuf, 1, SIZE, stdin),                 \
               (iS == iT ? EOF : *iS++))                                       \
            : *iS++)
// print the remaining part
inline void flush() {
  fwrite(obuf, 1, oS - obuf, stdout);
  oS = obuf;
}
// putchar
inline void putc(char x) {
  *oS++ = x;
  if (oS == oT)
    flush();
}
template <typename A> inline bool read(A &x) {
  for (f = 1, c = gc(); c < '0' || c > '9'; c = gc())
    if (c == '-')
      f = -1;
    else if (c == EOF)
      return 0;
  for (x = 0; c <= '9' && c >= '0'; c = gc())
    x = x * 10 + (c & 15);
  x *= f;
  return 1;
}
inline bool read(char &x) {
  while ((x = gc()) == ' ' || x == '\n' || x == '\r')
    ;
  return x != EOF;
}
inline bool read(char *x) {
  while ((*x = gc()) == '\n' || *x == ' ' || *x == '\r')
    ;
  if (*x == EOF)
    return 0;
  while (!(*x == '\n' || *x == ' ' || *x == '\r' || *x == EOF))
    *(++x) = gc();
  *x = 0;
  return 1;
}
template <typename A, typename... B> inline bool read(A &x, B &...y) {
  return read(x) && read(y...);
}
template <typename A> inline bool write(A x) {
  if (!x)
    putc('0');
  if (x < 0)
    putc('-'), x = -x;
  while (x)
    qu[++qr] = x % 10 + '0', x /= 10;
  while (qr)
    putc(qu[qr--]);
  return 0;
}
inline bool write(char x) {
  putc(x);
  return 0;
}
inline bool write(const char *x) {
  while (*x) {
    putc(*x);
    ++x;
  }
  return 0;
}
inline bool write(char *x) {
  while (*x) {
    putc(*x);
    ++x;
  }
  return 0;
}
template <typename A, typename... B> inline bool write(A x, B... y) {
  return write(x) || write(y...);
}
// no need to call flush at the end manually!
struct Flusher_ {
  ~Flusher_() { flush(); }
} io_flusher_;
} // namespace io
using io ::putc;
using io ::read;
using io ::write;
unsigned char f[300000005];
int n, m, s1, s2;
int x[205][205], y[205][205];
int s[205][205];
char str[205];
unsigned char w = -1, I = 1;
int dp(int xl, int xr, int yl, int yr) {
  unsigned char &cal = f[x[xl][xr] + y[yl][yr]];
  if (cal ^ w)
    return cal;
  int w = s[xr][yr] - s[xl - 1][yr] - s[xr][yl - 1] + s[xl - 1][yl - 1];
  //	write(xl,' ',xr,' ',yl,' ',yr,' ',w,'\n');
  if (!w || w == (xr - xl + 1) * (yr - yl + 1))
    return cal = 0;
  if (xl != xr) {
    int l = xl, r = xr - 1, mid;
    while (l <= r) {
      mid = (l + r) >> 1;
      unsigned char f1 = dp(xl, mid, yl, yr), f2 = dp(mid + 1, xr, yl, yr);
      chkmin(cal, (unsigned char)(max(f1, f2) + 1));
      if (f1 > f2)
        r = mid - 1;
      else if (f1 < f2)
        l = mid + 1;
      else
        break;
    }
  }
  if (yl != yr) {
    int l = yl, r = yr - 1, mid;
    while (l <= r) {
      mid = (l + r) >> 1;
      unsigned char f1 = dp(xl, xr, yl, mid), f2 = dp(xl, xr, mid + 1, yr);
      chkmin(cal, (unsigned char)(max(f1, f2) + 1));
      if (f1 > f2)
        r = mid - 1;
      else if (f1 < f2)
        l = mid + 1;
      else
        break;
    }
  }
  return cal;
}
signed main() {
#ifdef QAQAutoMaton
  freopen("D.in", "r", stdin);
  freopen("D.out", "w", stdout);
#endif
  read(n, m);
  for (int i = 1; i <= m; ++i)
    for (int j = i; j <= m; ++j) {
      y[i][j] = s2;
      ++s2;
    }
  for (int i = 1; i <= n; ++i)
    for (int j = i; j <= n; ++j) {
      x[i][j] = s1;
      s1 += s2;
    }
  for (int i = 0; i < s1; ++i)
    f[i] = w;
  for (int i = 1; i <= n; ++i) {
    read(str + 1);
    for (int j = 1; j <= m; ++j) {
      s[i][j] = s[i - 1][j] + s[i][j - 1] - s[i - 1][j - 1] + (str[j] == '#');
    }
  }
  write(dp(1, n, 1, m), '\n');
  return 0;
}