Problem p02782 (C++)

Buggy submission (status: Runtime Error):
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef double lf;
typedef pair<int, int> ii;
typedef pair<ii, int> iii;
#define REP(i, n) for (int i = 0; i < n; i++)
#define REP1(i, n) for (int i = 1; i <= n; i++)
#define RREP(i, n) for (int i = n - 1; i >= 0; i--)
#define RST(i, n) memset(i, n, sizeof i)
#define SZ(a) (ll) a.size()
#define ALL(a) a.begin(), a.end()
#define X first
#define Y second
#define mkp make_pair
#define pb push_back
#define eb emplace_back
#define pob pop_back
#ifdef cold66
#define debug(...)                                                             \
  do {                                                                         \
    fprintf(stderr, "%s - %d (%s) = ", __PRETTY_FUNCTION__, __LINE__,          \
            #__VA_ARGS__);                                                     \
    _do(__VA_ARGS__);                                                          \
  } while (0)
template <typename T> void _do(T &&_x) { cerr << _x << endl; }
template <typename T, typename... S> void _do(T &&_x, S &&..._t) {
  cerr << _x << ", ";
  _do(_t...);
}
template <typename _a, typename _b>
ostream &operator<<(ostream &_s, const pair<_a, _b> &_p) {
  return _s << "(" << _p.X << "," << _p.Y << ")";
}
template <typename It> ostream &_OUTC(ostream &_s, It _ita, It _itb) {
  _s << "{";
  for (It _it = _ita; _it != _itb; _it++) {
    _s << (_it == _ita ? "" : ",") << *_it;
  }
  _s << "}";
  return _s;
}
template <typename _a> ostream &operator<<(ostream &_s, vector<_a> &_c) {
  return _OUTC(_s, ALL(_c));
}
template <typename _a> ostream &operator<<(ostream &_s, set<_a> &_c) {
  return _OUTC(_s, ALL(_c));
}
template <typename _a, typename _b>
ostream &operator<<(ostream &_s, map<_a, _b> &_c) {
  return _OUTC(_s, ALL(_c));
}
template <typename _t> void pary(_t _a, _t _b) {
  _OUTC(cerr, _a, _b);
  cerr << endl;
}
#define IOS()
#else
#define debug(...)
#define pary(...)
#define endl '\n'
#define IOS()                                                                  \
  ios_base::sync_with_stdio(0);                                                \
  cin.tie(0);
#endif // cold66
//}
template <class T> inline bool chkmax(T &a, const T &b) {
  return b > a ? a = b, true : false;
}
template <class T> inline bool chkmin(T &a, const T &b) {
  return b < a ? a = b, true : false;
}
template <class T> using MaxHeap = priority_queue<T>;
template <class T> using MinHeap = priority_queue<T, vector<T>, greater<T>>;

const ll MAXn = 1e6 + 5, MAXlg = __lg(MAXn) + 2;
const ll MOD = 1000000007;
const ll INF = 0x3f3f3f3f;

ll fac[MAXn], inv[MAXn];
ll mul(ll a, ll b) { return a * b % MOD; }
ll add(ll a, ll b) {
  ll ret = a + b;
  if (ret >= MOD)
    ret -= MOD;
  return ret;
}
ll sub(ll a, ll b) {
  ll ret = a - b;
  if (ret < 0)
    ret += MOD;
  return ret;
}
ll fpow(ll a, ll b) {
  ll ret = 1;
  while (b) {
    if (b & 1)
      ret = mul(ret, a);
    a = mul(a, a);
    b >>= 1;
  }
  return ret;
}
ll C(ll n, ll m) {
  ll ret = mul(fac[n], inv[m]);
  ret = mul(ret, inv[n - m]);
  debug(n, m, ret);
  return ret;
}
int main() {
  IOS();
  int r1, c1, r2, c2;
  cin >> r1 >> c1 >> r2 >> c2;
  fac[0] = 1;
  inv[0] = 1;
  REP1(i, MAXn - 1) {
    fac[i] = mul(fac[i - 1], i);
    inv[i] = fpow(fac[i], MOD - 2);
  }
  ll ans = 0;
  for (ll i = c1 + 1; i <= c2 + 1; i++) {
    ans = add(ans, C(r2 + i, i));
    ans = sub(ans, C(r1 - 1 + i, i));
  }
  cout << ans << endl;
}


Fixed submission:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef double lf;
typedef pair<int, int> ii;
typedef pair<ii, int> iii;
#define REP(i, n) for (int i = 0; i < n; i++)
#define REP1(i, n) for (int i = 1; i <= n; i++)
#define RREP(i, n) for (int i = n - 1; i >= 0; i--)
#define RST(i, n) memset(i, n, sizeof i)
#define SZ(a) (ll) a.size()
#define ALL(a) a.begin(), a.end()
#define X first
#define Y second
#define mkp make_pair
#define pb push_back
#define eb emplace_back
#define pob pop_back
#ifdef cold66
#define debug(...)                                                             \
  do {                                                                         \
    fprintf(stderr, "%s - %d (%s) = ", __PRETTY_FUNCTION__, __LINE__,          \
            #__VA_ARGS__);                                                     \
    _do(__VA_ARGS__);                                                          \
  } while (0)
template <typename T> void _do(T &&_x) { cerr << _x << endl; }
template <typename T, typename... S> void _do(T &&_x, S &&..._t) {
  cerr << _x << ", ";
  _do(_t...);
}
template <typename _a, typename _b>
ostream &operator<<(ostream &_s, const pair<_a, _b> &_p) {
  return _s << "(" << _p.X << "," << _p.Y << ")";
}
template <typename It> ostream &_OUTC(ostream &_s, It _ita, It _itb) {
  _s << "{";
  for (It _it = _ita; _it != _itb; _it++) {
    _s << (_it == _ita ? "" : ",") << *_it;
  }
  _s << "}";
  return _s;
}
template <typename _a> ostream &operator<<(ostream &_s, vector<_a> &_c) {
  return _OUTC(_s, ALL(_c));
}
template <typename _a> ostream &operator<<(ostream &_s, set<_a> &_c) {
  return _OUTC(_s, ALL(_c));
}
template <typename _a, typename _b>
ostream &operator<<(ostream &_s, map<_a, _b> &_c) {
  return _OUTC(_s, ALL(_c));
}
template <typename _t> void pary(_t _a, _t _b) {
  _OUTC(cerr, _a, _b);
  cerr << endl;
}
#define IOS()
#else
#define debug(...)
#define pary(...)
#define endl '\n'
#define IOS()                                                                  \
  ios_base::sync_with_stdio(0);                                                \
  cin.tie(0);
#endif // cold66
//}
template <class T> inline bool chkmax(T &a, const T &b) {
  return b > a ? a = b, true : false;
}
template <class T> inline bool chkmin(T &a, const T &b) {
  return b < a ? a = b, true : false;
}
template <class T> using MaxHeap = priority_queue<T>;
template <class T> using MinHeap = priority_queue<T, vector<T>, greater<T>>;

const ll MAXn = 2e6 + 5, MAXlg = __lg(MAXn) + 2;
const ll MOD = 1000000007;
const ll INF = 0x3f3f3f3f;

ll fac[MAXn], inv[MAXn];
ll mul(ll a, ll b) { return a * b % MOD; }
ll add(ll a, ll b) {
  ll ret = a + b;
  if (ret >= MOD)
    ret -= MOD;
  return ret;
}
ll sub(ll a, ll b) {
  ll ret = a - b;
  if (ret < 0)
    ret += MOD;
  return ret;
}
ll fpow(ll a, ll b) {
  ll ret = 1;
  while (b) {
    if (b & 1)
      ret = mul(ret, a);
    a = mul(a, a);
    b >>= 1;
  }
  return ret;
}
ll C(ll n, ll m) {
  ll ret = mul(fac[n], inv[m]);
  ret = mul(ret, inv[n - m]);
  debug(n, m, ret);
  return ret;
}
int main() {
  IOS();
  int r1, c1, r2, c2;
  cin >> r1 >> c1 >> r2 >> c2;
  fac[0] = 1;
  inv[0] = 1;
  REP1(i, MAXn - 1) {
    fac[i] = mul(fac[i - 1], i);
    inv[i] = fpow(fac[i], MOD - 2);
  }
  ll ans = 0;
  for (ll i = c1 + 1; i <= c2 + 1; i++) {
    ans = add(ans, C(r2 + i, i));
    ans = sub(ans, C(r1 - 1 + i, i));
  }
  cout << ans << endl;
}