Problem p03234 (C++)

Buggy submission (status: Runtime Error):
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <vector>

using namespace std;

#define LL long long
#define fgx cerr << "--------------" << endl;
#define dgx cerr << "==============" << endl;

inline int read() {
  int x = 0, f = 1;
  char c = getchar();
  for (; !isdigit(c); c = getchar())
    if (c == '-')
      f = -1;
  for (; isdigit(c); c = getchar())
    x = x * 10 + c - '0';
  return x * f;
}
const int MAXN = 100010;
const int INF = 2147483600;
const LL Mod = 1000000007;

int N, K;
int a[MAXN + 1], b[MAXN + 1];
int sum[MAXN + 1];
LL f[310][310];
LL g[MAXN + 1];
inline int S(int l, int r) { return sum[r] - sum[l - 1]; }
inline bool In(int x, int l, int r) { return x >= l && x <= r; }

int main() {
  // freopen(".in","r",stdin);
  // freopen(".out","w",stdout);
  N = read() * 2, K = read();
  for (int i = 1; i <= K; i++) {
    a[i] = read(), b[i] = read();
    sum[a[i]] = sum[b[i]] = 1;
  }
  LL ans = 0;
  g[0] = 1;
  for (int i = 1; i <= N; i++) {
    if (i & 1)
      g[i] = 0;
    else
      g[i] = g[i - 2] * (i - 1) % Mod;
  }
  for (int i = 1; i <= N; i++)
    sum[i] += sum[i - 1];
  for (int len = 1; len <= N; len++) {
    if (len & 1)
      continue;
    for (int i = 1; i + len - 1 <= N; i++) {
      int j = i + len - 1;
      bool flag = 0;
      for (int k = 1; k <= K; k++) {
        if (In(a[k], i, j) && !In(b[k], i, j)) {
          flag = 1;
          break;
        }
        if (!In(a[k], i, j) && In(b[k], i, j)) {
          flag = 1;
          break;
        }
      }
      if (flag) {
        f[i][j] = 0;
        continue;
      }
      f[i][j] = g[len - S(i, j)];
      for (int k = i; k < j; k++)
        f[i][j] =
            (f[i][j] - g[j - k - S(k + 1, j)] * f[i][k] % Mod + Mod) % Mod;
      (ans += f[i][j] * g[N - len - 2 * K + S(i, j)] % Mod) %= Mod;
    }
  }
  printf("%lld\n", ans);
  return 0;
}


Fixed submission:
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <vector>

using namespace std;

#define LL long long
#define fgx cerr << "--------------" << endl;
#define dgx cerr << "==============" << endl;

inline int read() {
  int x = 0, f = 1;
  char c = getchar();
  for (; !isdigit(c); c = getchar())
    if (c == '-')
      f = -1;
  for (; isdigit(c); c = getchar())
    x = x * 10 + c - '0';
  return x * f;
}
const int MAXN = 100010;
const int INF = 2147483600;
const LL Mod = 1000000007;

int N, K;
int a[MAXN + 1], b[MAXN + 1];
int sum[MAXN + 1];
LL f[610][610];
LL g[MAXN + 1];
inline int S(int l, int r) { return sum[r] - sum[l - 1]; }
inline bool In(int x, int l, int r) { return x >= l && x <= r; }

int main() {
  // freopen(".in","r",stdin);
  // freopen(".out","w",stdout);
  N = read() * 2, K = read();
  for (int i = 1; i <= K; i++) {
    a[i] = read(), b[i] = read();
    sum[a[i]] = sum[b[i]] = 1;
  }
  LL ans = 0;
  g[0] = 1;
  for (int i = 1; i <= N; i++) {
    if (i & 1)
      g[i] = 0;
    else
      g[i] = g[i - 2] * (i - 1) % Mod;
  }
  for (int i = 1; i <= N; i++)
    sum[i] += sum[i - 1];
  for (int len = 1; len <= N; len++) {
    if (len & 1)
      continue;
    for (int i = 1; i + len - 1 <= N; i++) {
      int j = i + len - 1;
      bool flag = 0;
      for (int k = 1; k <= K; k++) {
        if (In(a[k], i, j) && !In(b[k], i, j)) {
          flag = 1;
          break;
        }
        if (!In(a[k], i, j) && In(b[k], i, j)) {
          flag = 1;
          break;
        }
      }
      if (flag) {
        f[i][j] = 0;
        continue;
      }
      f[i][j] = g[len - S(i, j)];
      for (int k = i; k < j; k++)
        f[i][j] =
            (f[i][j] - g[j - k - S(k + 1, j)] * f[i][k] % Mod + Mod) % Mod;
      (ans += f[i][j] * g[N - len - 2 * K + S(i, j)] % Mod) %= Mod;
    }
  }
  printf("%lld\n", ans);
  return 0;
}