Problem p03237 (C++)

Buggy submission (status: Runtime Error):
#include <bits/stdc++.h>
using namespace std;
namespace io {
const int l = 1 << 20;
char buf[l], *s, *t, c;
inline void gc() {
  if (s == t) {
    t = (s = buf) + fread(buf, 1, l, stdin);
    c = s == t ? EOF : *s++;
  } else
    c = *s++;
}
template <class IT> inline void gi(IT &x) {
  x = 0;
  gc();
  while (c < '0' || c > '9')
    gc();
  while ('0' <= c && c <= '9') {
    x = (x << 1) + (x << 3) + (c ^ 48);
    gc();
  }
}
char buf0[20];
int a;
template <class IT> inline void pi(IT x) {
  if (x < 0) {
    putchar('-');
    x = -x;
  }
  do
    buf0[++a] = x % 10 + 48;
  while (x /= 10);
  while (a)
    putchar(buf0[a--]);
  putchar('\n');
}
}; // namespace io
using io::gi;
using io::pi;
typedef unsigned int ui;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int, int> pii;
typedef pair<int, ll> pil;
typedef pair<ll, int> pli;
typedef pair<ll, ll> pll;
typedef vector<int> vi;
typedef vector<ll> vl;
#define pque priority_queue
#define rep(i, l, r) for (i = (l); i <= (r); ++i)
#define per(i, l, r) for (i = (l); i >= (r); --i)
#define REP(i, l, r) for (i = (l); i < (r); ++i)
#define PER(i, l, r) for (i = (l); i > (r); --i)
#define mp make_pair
#define pb push_back
#define pf push_front
#define pob pop_back
#define pof pop_front
#define fi first
#define se second
template <class IT> inline void cmax(IT &a, IT b) {
  if (a < b)
    a = b;
}
template <class IT> inline void cmin(IT &a, IT b) {
  if (b < a)
    a = b;
}
const int N = 1505;
int a[N][N], f[N][N];
short l[N][N], r[N][N];
char c[N];
int main() {
  // freopen("a.in","r",stdin);
  // freopen("a.out","w",stdout);
  int n, i, j, k, t;
  short m;
  ll ans = 0ll;
  scanf("%d", &n);
  rep(i, 1, n) {
    scanf("%s", c + 1);
    rep(j, 1, n) a[i][j] = ((c[j] == '#') ? 0 : (c[j] ^ 48));
  }
  per(i, n, 1) per(j, n, 1) {
    if (a[i][j]) {
      if (a[i + 1][j]) {
        if (a[i][j + 1]) {
          l[j][i] = j;
          r[j][i] = r[j + 1][i];
          t = f[i][j + 1] + f[i + 1][j];
          m = 0;
          rep(k, i + 1, t) {
            if (r[j][k] >= l[j + 1][k] && l[j + 1][k] > m)
              t -= f[k][l[j + 1][k]];
            cmax(m, r[j][k]);
            cmin(l[j][k], l[j + 1][k]);
            cmax(r[j][k], r[j + 1][k]);
          }
          f[i][j] = t;
        } else {
          l[j][i] = r[j][i] = j;
          f[i][j] = f[i + 1][j];
        }
      } else {
        if (a[i][j + 1]) {
          memcpy(l[j] + i, l[j + 1] + i, (n - i + 1) << 1);
          memcpy(r[j] + i, r[j + 1] + i, (n - i + 1) << 1);
          l[j][i] = j;
          f[i][j] = f[i][j + 1];
        } else
          l[j][i] = r[j][i] = j;
      }
      ans += a[i][j] * f[i][j];
      f[i][j] += a[i][j];
    } else {
      memset(l[j] + i, 0x3f, (n - i + 1) << 1);
      memset(r[j] + i, 0, (n - i + 1) << 1);
    }
    // printf("(%d,%d) f=%d\n",i,j,f[i][j]);
    // rep(k,i,n)printf("(%d,[%d,%d])\n",k,l[j][k],r[j][k]);
  }
  printf("%lld", ans);
  return 0;
}

Fixed submission:
#include <bits/stdc++.h>
using namespace std;
namespace io {
const int l = 1 << 20;
char buf[l], *s, *t, c;
inline void gc() {
  if (s == t) {
    t = (s = buf) + fread(buf, 1, l, stdin);
    c = s == t ? EOF : *s++;
  } else
    c = *s++;
}
template <class IT> inline void gi(IT &x) {
  x = 0;
  gc();
  while (c < '0' || c > '9')
    gc();
  while ('0' <= c && c <= '9') {
    x = (x << 1) + (x << 3) + (c ^ 48);
    gc();
  }
}
char buf0[20];
int a;
template <class IT> inline void pi(IT x) {
  if (x < 0) {
    putchar('-');
    x = -x;
  }
  do
    buf0[++a] = x % 10 + 48;
  while (x /= 10);
  while (a)
    putchar(buf0[a--]);
  putchar('\n');
}
}; // namespace io
using io::gi;
using io::pi;
typedef unsigned int ui;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int, int> pii;
typedef pair<int, ll> pil;
typedef pair<ll, int> pli;
typedef pair<ll, ll> pll;
typedef vector<int> vi;
typedef vector<ll> vl;
#define pque priority_queue
#define rep(i, l, r) for (i = (l); i <= (r); ++i)
#define per(i, l, r) for (i = (l); i >= (r); --i)
#define REP(i, l, r) for (i = (l); i < (r); ++i)
#define PER(i, l, r) for (i = (l); i > (r); --i)
#define mp make_pair
#define pb push_back
#define pf push_front
#define pob pop_back
#define pof pop_front
#define fi first
#define se second
template <class IT> inline void cmax(IT &a, IT b) {
  if (a < b)
    a = b;
}
template <class IT> inline void cmin(IT &a, IT b) {
  if (b < a)
    a = b;
}
const int N = 1505;
int a[N][N], f[N][N];
short l[N][N], r[N][N];
char c[N];
int main() {
  // freopen("a.in","r",stdin);
  // freopen("a.out","w",stdout);
  int n, i, j, k, t;
  short m;
  ll ans = 0ll;
  scanf("%d", &n);
  rep(i, 1, n) {
    scanf("%s", c + 1);
    rep(j, 1, n) a[i][j] = ((c[j] == '#') ? 0 : (c[j] ^ 48));
  }
  per(i, n, 1) per(j, n, 1) {
    if (a[i][j]) {
      if (a[i + 1][j]) {
        if (a[i][j + 1]) {
          l[j][i] = j;
          r[j][i] = r[j + 1][i];
          t = f[i][j + 1] + f[i + 1][j];
          m = 0;
          rep(k, i + 1, n) {
            if (r[j][k] >= l[j + 1][k] && l[j + 1][k] > m)
              t -= f[k][l[j + 1][k]];
            cmax(m, r[j][k]);
            cmin(l[j][k], l[j + 1][k]);
            cmax(r[j][k], r[j + 1][k]);
          }
          f[i][j] = t;
        } else {
          l[j][i] = r[j][i] = j;
          f[i][j] = f[i + 1][j];
        }
      } else {
        if (a[i][j + 1]) {
          memcpy(l[j] + i, l[j + 1] + i, (n - i + 1) << 1);
          memcpy(r[j] + i, r[j + 1] + i, (n - i + 1) << 1);
          l[j][i] = j;
          f[i][j] = f[i][j + 1];
        } else
          l[j][i] = r[j][i] = j;
      }
      ans += a[i][j] * f[i][j];
      f[i][j] += a[i][j];
    } else {
      memset(l[j] + i, 0x3f, (n - i + 1) << 1);
      memset(r[j] + i, 0, (n - i + 1) << 1);
    }
    // printf("(%d,%d) f=%d\n",i,j,f[i][j]);
    // rep(k,i,n)printf("(%d,[%d,%d])\n",k,l[j][k],r[j][k]);
  }
  printf("%lld", ans);
  return 0;
}