Problem p03655 (C++)

Buggy submission (status: Runtime Error):
#include <algorithm>
#include <cctype>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
using namespace std;
struct rec {
  int x1, x2, y1, y2;
} s1, s2, s3;
#define MAXN 1000010
#define MOD 1000000007
int fac[MAXN], inv[MAXN];
int power(int a, int b) {
  int res = 1;
  while (b > 0) {
    if (b & 1)
      res = 1ll * res * a % MOD;
    a = 1ll * a * a % MOD;
    b = b >> 1;
  }
  return res;
}
int comb(int n, int m) {
  return 1ll * fac[n] * inv[m] % MOD * inv[n - m] % MOD;
}
int C(int x1, int y1, int x2, int y2) {
  if (x1 > x2)
    swap(x1, x2);
  if (y1 > y2)
    swap(y1, y2);
  return comb(y2 - y1 + x2 - x1, y2 - y1);
}
int calc(int x, int y,
         rec s) { // cout << x << " " << y << " " << s.x1 << " " << s.x2 << " "
                  // << s.y1 << " " << s.y2 << " : ";
  if (x >= s.x1 && x >= s.x2 && y >= s.y1 && y >= s.y2) {
    s.x1 *= -1;
    s.y1 *= -1;
    s.x2 *= -1;
    s.y2 *= -1;
    swap(s.x1, s.x2);
    swap(s.y1, s.y2);
    x *= -1;
    y *= -1;
  } // cout << C(x,y,s.x2 + 1,s.y2 + 1) - C(x,y,s.x2 + 1,s.y1) - C(x,y,s.x1,s.y2
    // + 1) + C(x,y,s.x1,s.y1) << endl;
  int ans = 0;
  ans = (ans + C(x, y, s.x2 + 1, s.y2 + 1)) % MOD;
  ans = (ans - C(x, y, s.x2 + 1, s.y1) + MOD) % MOD;
  ans = (ans - C(x, y, s.x1, s.y2 + 1) + MOD) % MOD;
  ans = (ans + C(x, y, s.x1, s.y1)) % MOD;
  return ans;
}
int main() {
  fac[0] = 1;
  for (int i = 1; i < MAXN; ++i)
    fac[i] = 1ll * fac[i - 1] * i % MOD;
  inv[MAXN - 1] = power(fac[MAXN - 1], MOD - 2);
  for (int i = MAXN - 2; i >= 0; --i)
    inv[i] = 1ll * inv[i + 1] * (i + 1) % MOD;
  scanf("%d%d%d%d%d%d", &s1.x1, &s1.x2, &s2.x1, &s2.x2, &s3.x1, &s3.x2);
  scanf("%d%d%d%d%d%d", &s1.y1, &s1.y2, &s2.y1, &s2.y2, &s3.y1, &s3.y2);
  int ans = 0;
  for (int i = s2.x1; i <= s2.x2; ++i) {
    ans = (ans -
           1ll * calc(i, s2.y1 - 1, s1) * calc(i, s2.y1, s3) % MOD *
               (i + s2.y1) % MOD +
           MOD) %
          MOD;
    ans = (ans + 1ll * calc(i, s2.y2, s1) * calc(i, s2.y2 + 1, s3) % MOD *
                     (i + s2.y2 + 1) % MOD) %
          MOD;
    // cout << calc(i,s2.y2,s1) << " " << calc(i,s2.y2 + 1,s3) << " " << (i +
    // s2.y2 + 1) << endl; cout << " : " << ans << endl;
  } // cout << ans << endl;
  for (int i = s2.y1; i <= s2.y2; ++i) {
    ans = (ans -
           1ll * calc(s2.x1 - 1, i, s1) * calc(s2.x1, i, s3) % MOD *
               (s2.x1 + i) % MOD +
           MOD) %
          MOD;
    ans = (ans + 1ll * calc(s2.x2, i, s1) * calc(s2.x2 + 1, i, s3) % MOD *
                     (s2.x2 + i + 1) % MOD) %
          MOD;
    // cout << " : " << ans << endl;
  }
  cout << ans << endl;
  return 0;
}

Fixed submission:
#include <algorithm>
#include <cctype>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
using namespace std;
struct rec {
  int x1, x2, y1, y2;
} s1, s2, s3;
#define MAXN 2000010
#define MOD 1000000007
int fac[MAXN], inv[MAXN];
int power(int a, int b) {
  int res = 1;
  while (b > 0) {
    if (b & 1)
      res = 1ll * res * a % MOD;
    a = 1ll * a * a % MOD;
    b = b >> 1;
  }
  return res;
}
int comb(int n, int m) {
  return 1ll * fac[n] * inv[m] % MOD * inv[n - m] % MOD;
}
int C(int x1, int y1, int x2, int y2) {
  if (x1 > x2)
    swap(x1, x2);
  if (y1 > y2)
    swap(y1, y2);
  return comb(y2 - y1 + x2 - x1, y2 - y1);
}
int calc(int x, int y,
         rec s) { // cout << x << " " << y << " " << s.x1 << " " << s.x2 << " "
                  // << s.y1 << " " << s.y2 << " : ";
  if (x >= s.x1 && x >= s.x2 && y >= s.y1 && y >= s.y2) {
    s.x1 *= -1;
    s.y1 *= -1;
    s.x2 *= -1;
    s.y2 *= -1;
    swap(s.x1, s.x2);
    swap(s.y1, s.y2);
    x *= -1;
    y *= -1;
  } // cout << C(x,y,s.x2 + 1,s.y2 + 1) - C(x,y,s.x2 + 1,s.y1) - C(x,y,s.x1,s.y2
    // + 1) + C(x,y,s.x1,s.y1) << endl;
  int ans = 0;
  ans = (ans + C(x, y, s.x2 + 1, s.y2 + 1)) % MOD;
  ans = (ans - C(x, y, s.x2 + 1, s.y1) + MOD) % MOD;
  ans = (ans - C(x, y, s.x1, s.y2 + 1) + MOD) % MOD;
  ans = (ans + C(x, y, s.x1, s.y1)) % MOD;
  return ans;
}
int main() {
  fac[0] = 1;
  for (int i = 1; i < MAXN; ++i)
    fac[i] = 1ll * fac[i - 1] * i % MOD;
  inv[MAXN - 1] = power(fac[MAXN - 1], MOD - 2);
  for (int i = MAXN - 2; i >= 0; --i)
    inv[i] = 1ll * inv[i + 1] * (i + 1) % MOD;
  scanf("%d%d%d%d%d%d", &s1.x1, &s1.x2, &s2.x1, &s2.x2, &s3.x1, &s3.x2);
  scanf("%d%d%d%d%d%d", &s1.y1, &s1.y2, &s2.y1, &s2.y2, &s3.y1, &s3.y2);
  int ans = 0;
  for (int i = s2.x1; i <= s2.x2; ++i) {
    ans = (ans -
           1ll * calc(i, s2.y1 - 1, s1) * calc(i, s2.y1, s3) % MOD *
               (i + s2.y1) % MOD +
           MOD) %
          MOD;
    ans = (ans + 1ll * calc(i, s2.y2, s1) * calc(i, s2.y2 + 1, s3) % MOD *
                     (i + s2.y2 + 1) % MOD) %
          MOD;
    // cout << calc(i,s2.y2,s1) << " " << calc(i,s2.y2 + 1,s3) << " " << (i +
    // s2.y2 + 1) << endl; cout << " : " << ans << endl;
  } // cout << ans << endl;
  for (int i = s2.y1; i <= s2.y2; ++i) {
    ans = (ans -
           1ll * calc(s2.x1 - 1, i, s1) * calc(s2.x1, i, s3) % MOD *
               (s2.x1 + i) % MOD +
           MOD) %
          MOD;
    ans = (ans + 1ll * calc(s2.x2, i, s1) * calc(s2.x2 + 1, i, s3) % MOD *
                     (s2.x2 + i + 1) % MOD) %
          MOD;
    // cout << " : " << ans << endl;
  }
  cout << ans << endl;
  return 0;
}