Problem p03707 (C++)

Buggy submission (status: Runtime Error):
#include <bits/stdc++.h>

using namespace std;

typedef long long ll;
typedef vector<int> vi;
typedef vector<ll> vl;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;

typedef int _loop_int;
#define REP(i, n) for (_loop_int i = 0; i < (_loop_int)(n); ++i)
#define FOR(i, a, b) for (_loop_int i = (_loop_int)(a); i < (_loop_int)(b); ++i)
#define FORR(i, a, b)                                                          \
  for (_loop_int i = (_loop_int)(b)-1; i >= (_loop_int)(a); --i)

#define DEBUG(x) cout << #x << ": " << x << endl
#define DEBUG_VEC(v)                                                           \
  cout << #v << ":";                                                           \
  REP(i, v.size()) cout << " " << v[i];                                        \
  cout << endl
#define ALL(a) (a).begin(), (a).end()

#define CHMIN(a, b) a = min((a), (b))
#define CHMAX(a, b) a = max((a), (b))

// mod
const ll MOD = 1000000007ll;
#define FIX(a) ((a) % MOD + MOD) % MOD

// floating
typedef double Real;
const Real EPS = 1e-11;
#define EQ0(x) (abs(x) < EPS)
#define EQ(a, b) (abs(a - b) < EPS)
typedef complex<Real> P;

int n, m, q;
char s[2521][2521];
int vsum[2521][2521];
int esum1[2521][2521];
int esum2[2521][2521];

int ggg(int l, int r, int u, int d, int sum[2521][2521]) {
  // if(l>r || u>d)return 0;
  int ret = sum[d][r];
  if (l > 0)
    ret -= sum[d][l - 1];
  if (u > 0)
    ret -= sum[u - 1][r];
  if (l > 0 && u > 0)
    ret += sum[u - 1][l - 1];
  return ret;
}

int main() {
  scanf("%d%d%d", &n, &m, &q);
  REP(i, n) scanf("%s", s[i]);
  REP(i, n) REP(j, m) {
    vsum[i][j] = s[i][j] == '1';
    if (j < m - 1) {
      esum1[i][j] = (s[i][j] == '1' && s[i][j + 1] == '1');
    }
    if (i < n - 1) {
      esum2[i][j] = (s[i][j] == '1' && s[i + 1][j] == '1');
    }
  }
  REP(i, n) REP(j, m) vsum[i][j + 1] += vsum[i][j];
  REP(i, n) REP(j, m) vsum[i + 1][j] += vsum[i][j];
  REP(i, n) REP(j, m) esum1[i][j + 1] += esum1[i][j];
  REP(i, n) REP(j, m) esum1[i + 1][j] += esum1[i][j];
  REP(i, n) REP(j, m) esum2[i][j + 1] += esum2[i][j];
  REP(i, n) REP(j, m) esum2[i + 1][j] += esum2[i][j];
  while (q--) {
    int l, r, u, d;
    scanf("%d%d%d%d", &u, &l, &d, &r);
    --l;
    --r;
    --u;
    --d;
    // DEBUG(d);
    // DEBUG(r);
    // DEBUG(n-1);
    // DEBUG(m-1);
    int ans = ggg(l, r, u, d, vsum) - ggg(l, r - 1, u, d, esum1) -
              ggg(l, r, u, d - 1, esum2);
    printf("%d\n", ans);
  }
  return 0;
}


Fixed submission:
#include <bits/stdc++.h>

using namespace std;

typedef long long ll;
typedef vector<int> vi;
typedef vector<ll> vl;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;

typedef int _loop_int;
#define REP(i, n) for (_loop_int i = 0; i < (_loop_int)(n); ++i)
#define FOR(i, a, b) for (_loop_int i = (_loop_int)(a); i < (_loop_int)(b); ++i)
#define FORR(i, a, b)                                                          \
  for (_loop_int i = (_loop_int)(b)-1; i >= (_loop_int)(a); --i)

#define DEBUG(x) cout << #x << ": " << x << endl
#define DEBUG_VEC(v)                                                           \
  cout << #v << ":";                                                           \
  REP(i, v.size()) cout << " " << v[i];                                        \
  cout << endl
#define ALL(a) (a).begin(), (a).end()

#define CHMIN(a, b) a = min((a), (b))
#define CHMAX(a, b) a = max((a), (b))

// mod
const ll MOD = 1000000007ll;
#define FIX(a) ((a) % MOD + MOD) % MOD

// floating
typedef double Real;
const Real EPS = 1e-11;
#define EQ0(x) (abs(x) < EPS)
#define EQ(a, b) (abs(a - b) < EPS)
typedef complex<Real> P;

int n, m, q;
char s[2521][2521];
int vsum[2521][2521];
int esum1[2521][2521];
int esum2[2521][2521];

int ggg(int l, int r, int u, int d, int sum[2521][2521]) {
  if (l > r || u > d)
    return 0;
  int ret = sum[d][r];
  if (l > 0)
    ret -= sum[d][l - 1];
  if (u > 0)
    ret -= sum[u - 1][r];
  if (l > 0 && u > 0)
    ret += sum[u - 1][l - 1];
  return ret;
}

int main() {
  scanf("%d%d%d", &n, &m, &q);
  REP(i, n) scanf("%s", s[i]);
  REP(i, n) REP(j, m) {
    vsum[i][j] = s[i][j] == '1';
    if (j < m - 1) {
      esum1[i][j] = (s[i][j] == '1' && s[i][j + 1] == '1');
    }
    if (i < n - 1) {
      esum2[i][j] = (s[i][j] == '1' && s[i + 1][j] == '1');
    }
  }
  REP(i, n) REP(j, m) vsum[i][j + 1] += vsum[i][j];
  REP(i, n) REP(j, m) vsum[i + 1][j] += vsum[i][j];
  REP(i, n) REP(j, m) esum1[i][j + 1] += esum1[i][j];
  REP(i, n) REP(j, m) esum1[i + 1][j] += esum1[i][j];
  REP(i, n) REP(j, m) esum2[i][j + 1] += esum2[i][j];
  REP(i, n) REP(j, m) esum2[i + 1][j] += esum2[i][j];
  while (q--) {
    int l, r, u, d;
    scanf("%d%d%d%d", &u, &l, &d, &r);
    --l;
    --r;
    --u;
    --d;
    // DEBUG(d);
    // DEBUG(r);
    // DEBUG(n-1);
    // DEBUG(m-1);
    int ans = ggg(l, r, u, d, vsum) - ggg(l, r - 1, u, d, esum1) -
              ggg(l, r, u, d - 1, esum2);
    printf("%d\n", ans);
  }
  return 0;
}