Problem p03655 (C++)

Buggy submission (status: Runtime Error):
#include <bits/stdc++.h>
using namespace std;
#define ref(i, x, y) for (int i = x; i <= y; ++i)
#define def(i, x, y) for (int i = x; i >= y; --i)
#define y1 Y1
typedef long long LL;
const int mod = 1e9 + 7;
const int N = 1000000;
int ft[N + 1], Ft[N + 1];
void inc(int &a, int b) {
  a += b;
  if (a >= mod)
    a -= mod;
}
void dec(int &a, int b) {
  a -= b;
  if (a < 0)
    a += mod;
}
int mul(int a, int b) { return (LL)a * b % mod; }
int mi(int a, int b) {
  int s = 1;
  for (; b; b >>= 1, a = mul(a, a))
    if (b & 1)
      s = mul(s, a);
  return s;
}
int calc(int a, int b) {
  a += b;
  if (a < 0 || b < 0 || b > a)
    return 0;
  return mul(ft[a], mul(Ft[b], Ft[a - b]));
}
int solve(int x1, int y1, int x2, int y2, int x3, int y3, int x4, int y4) {
  int res = 0, s = 0;
  res = s = mul(calc(x2 - x1, y2 - y1), calc(x4 - x2, y4 - y2));
  int px1 = x2, py1 = y2, px2 = x2, py2 = y2;
  ref(i, x2 + y2 + 1, x3 + y3) {
    int qx1 = px1, qy1 = py1;
    if (qy1 < y3)
      qy1++;
    else
      qx1++;
    int qx2 = px2, qy2 = py2;
    if (qx2 < x3)
      qx2++;
    else
      qy2++;
    if (py1 < qy1)
      inc(s, mul(calc(qx1 - 1 - x1, qy1 - y1), calc(x4 - qx1, y4 - qy1)));
    else
      dec(s, mul(calc(px1 - x1, py1 - y1), calc(x4 - px1, y4 - (py1 + 1))));
    if (px2 < qx2)
      inc(s, mul(calc(qx2 - x1, qy2 - 1 - y1), calc(x4 - qx2, y4 - qy2)));
    else
      dec(s, mul(calc(px2 - x1, py2 - y1), calc(x4 - (px2 + 1), y4 - py2)));
    inc(res, s);
    px1 = qx1;
    py1 = qy1;
    px2 = qx2;
    py2 = qy2;
  }
  // cout<<res<<endl;
  return res;
}
int x1, x2, x3, x4, x5, x6;
int y1, y2, y3, y4, y5, y6;
int ans;
int main() {
  ft[0] = 1;
  ref(i, 1, N) ft[i] = mul(ft[i - 1], i);
  Ft[N] = mi(ft[N], mod - 2);
  def(i, N, 1) Ft[i - 1] = mul(Ft[i], i);
  cin >> x1 >> x2 >> x3 >> x4 >> x5 >> x6;
  cin >> y1 >> y2 >> y3 >> y4 >> y5 >> y6;
  ref(a, 0, 1) ref(b, 0, 1) ref(c, 0, 1) ref(d, 0, 1) {
    int s = solve(a ? x2 : (x1 - 1), b ? y2 : (y1 - 1), x3, y3, x4, y4,
                  c ? x5 : (x6 + 1), d ? y5 : (y6 + 1));
    if (a ^ b ^ c ^ d)
      dec(ans, s);
    else
      inc(ans, s);
  }
  cout << ans << endl;
}

Fixed submission:
#include <bits/stdc++.h>
using namespace std;
#define ref(i, x, y) for (int i = x; i <= y; ++i)
#define def(i, x, y) for (int i = x; i >= y; --i)
#define y1 Y1
typedef long long LL;
const int mod = 1e9 + 7;
const int N = 2000000;
int ft[N + 1], Ft[N + 1];
void inc(int &a, int b) {
  a += b;
  if (a >= mod)
    a -= mod;
}
void dec(int &a, int b) {
  a -= b;
  if (a < 0)
    a += mod;
}
int mul(int a, int b) { return (LL)a * b % mod; }
int mi(int a, int b) {
  int s = 1;
  for (; b; b >>= 1, a = mul(a, a))
    if (b & 1)
      s = mul(s, a);
  return s;
}
int calc(int a, int b) {
  a += b;
  if (a < 0 || b < 0 || b > a)
    return 0;
  return mul(ft[a], mul(Ft[b], Ft[a - b]));
}
int solve(int x1, int y1, int x2, int y2, int x3, int y3, int x4, int y4) {
  int res = 0, s = 0;
  res = s = mul(calc(x2 - x1, y2 - y1), calc(x4 - x2, y4 - y2));
  int px1 = x2, py1 = y2, px2 = x2, py2 = y2;
  ref(i, x2 + y2 + 1, x3 + y3) {
    int qx1 = px1, qy1 = py1;
    if (qy1 < y3)
      qy1++;
    else
      qx1++;
    int qx2 = px2, qy2 = py2;
    if (qx2 < x3)
      qx2++;
    else
      qy2++;
    if (py1 < qy1)
      inc(s, mul(calc(qx1 - 1 - x1, qy1 - y1), calc(x4 - qx1, y4 - qy1)));
    else
      dec(s, mul(calc(px1 - x1, py1 - y1), calc(x4 - px1, y4 - (py1 + 1))));
    if (px2 < qx2)
      inc(s, mul(calc(qx2 - x1, qy2 - 1 - y1), calc(x4 - qx2, y4 - qy2)));
    else
      dec(s, mul(calc(px2 - x1, py2 - y1), calc(x4 - (px2 + 1), y4 - py2)));
    inc(res, s);
    px1 = qx1;
    py1 = qy1;
    px2 = qx2;
    py2 = qy2;
  }
  // cout<<res<<endl;
  return res;
}
int x1, x2, x3, x4, x5, x6;
int y1, y2, y3, y4, y5, y6;
int ans;
int main() {
  ft[0] = 1;
  ref(i, 1, N) ft[i] = mul(ft[i - 1], i);
  Ft[N] = mi(ft[N], mod - 2);
  def(i, N, 1) Ft[i - 1] = mul(Ft[i], i);
  cin >> x1 >> x2 >> x3 >> x4 >> x5 >> x6;
  cin >> y1 >> y2 >> y3 >> y4 >> y5 >> y6;
  ref(a, 0, 1) ref(b, 0, 1) ref(c, 0, 1) ref(d, 0, 1) {
    int s = solve(a ? x2 : (x1 - 1), b ? y2 : (y1 - 1), x3, y3, x4, y4,
                  c ? x5 : (x6 + 1), d ? y5 : (y6 + 1));
    if (a ^ b ^ c ^ d)
      dec(ans, s);
    else
      inc(ans, s);
  }
  cout << ans << endl;
}