Problem p03234 (C++)

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

#define N 310

using namespace std;

typedef long long ll;

const int mod = 1000000007;

char *p1, *p2, buf[100000];

#define nc()                                                                   \
  (p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, 100000, stdin), p1 == p2)      \
       ? EOF                                                                   \
       : *p1++)

int rd() {
  int x = 0, f = 1;
  char c = nc();
  while (c < 48) {
    if (c == '-')
      f = -1;
    c = nc();
  }
  while (c > 47) {
    x = (((x << 2) + x) << 1) + (c ^ 48), c = nc();
  }
  return x * f;
}

int to[N], sum[N], dp[N][N], g[N];

int main() {
  int n = rd(), k = rd();
  for (int i = 1; i <= k; i++) {
    int x = rd(), y = rd();
    to[x] = y, to[y] = x;
    sum[x]++, sum[y]++;
  }
  n *= 2;
  for (int i = 1; i <= n; i++) {
    sum[i] += sum[i - 1];
  }

  // init_g
  g[0] = 1;
  for (int i = 2; i <= n; i += 2) {
    g[i] = (ll)g[i - 2] * (i - 1) % mod;
  }

  for (int i = 1; i <= n; i++) {
    for (int j = i + 1; j <= n; j += 2) {
      bool flag = false;
      for (int k = i; k <= j; k++) {
        if (to[k] && (to[k] < i || to[k] > j)) {
          flag = true;
          break;
        }
      }
      if (flag) {
        continue;
      }
      dp[i][j] = g[j - i + 1 - sum[j] + sum[i - 1]];
      for (int l = i + 1; l < j; l += 2) {
        dp[i][j] = ((ll)dp[i][j] + mod -
                    (ll)dp[i][l] * g[j - l - sum[j] + sum[l]] % mod) %
                   mod;
      }
    }
  }
  k <<= 1;
  int ans = 0;

  for (int i = 1; i <= n; i++) {
    for (int j = i + 1; j <= n; j += 2) {
      ans = (ans + (ll)dp[i][j] *
                       g[n - (j - i + 1) - (k - (sum[j] - sum[i - 1]))] % mod) %
            mod;
    }
  }

  cout << ans << endl;
  return 0;
}

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

#define N 1010

using namespace std;

typedef long long ll;

const int mod = 1000000007;

char *p1, *p2, buf[100000];

#define nc()                                                                   \
  (p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, 100000, stdin), p1 == p2)      \
       ? EOF                                                                   \
       : *p1++)

int rd() {
  int x = 0, f = 1;
  char c = nc();
  while (c < 48) {
    if (c == '-')
      f = -1;
    c = nc();
  }
  while (c > 47) {
    x = (((x << 2) + x) << 1) + (c ^ 48), c = nc();
  }
  return x * f;
}

int to[N], sum[N], dp[N][N], g[N];

int main() {
  int n = rd(), k = rd();
  for (int i = 1; i <= k; i++) {
    int x = rd(), y = rd();
    to[x] = y, to[y] = x;
    sum[x]++, sum[y]++;
  }
  n *= 2;
  for (int i = 1; i <= n; i++) {
    sum[i] += sum[i - 1];
  }

  // init_g
  g[0] = 1;
  for (int i = 2; i <= n; i += 2) {
    g[i] = (ll)g[i - 2] * (i - 1) % mod;
  }

  for (int i = 1; i <= n; i++) {
    for (int j = i + 1; j <= n; j += 2) {
      bool flag = false;
      for (int k = i; k <= j; k++) {
        if (to[k] && (to[k] < i || to[k] > j)) {
          flag = true;
          break;
        }
      }
      if (flag) {
        continue;
      }
      dp[i][j] = g[j - i + 1 - sum[j] + sum[i - 1]];
      for (int l = i + 1; l < j; l += 2) {
        dp[i][j] = ((ll)dp[i][j] + mod -
                    (ll)dp[i][l] * g[j - l - sum[j] + sum[l]] % mod) %
                   mod;
      }
    }
  }
  k <<= 1;
  int ans = 0;

  for (int i = 1; i <= n; i++) {
    for (int j = i + 1; j <= n; j += 2) {
      ans = (ans + (ll)dp[i][j] *
                       g[n - (j - i + 1) - (k - (sum[j] - sum[i - 1]))] % mod) %
            mod;
    }
  }

  cout << ans << endl;
  return 0;
}