Problem p03717 (C++)

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

#define REP(i, a, b) for (int i = a, i##_end_ = b; i <= i##_end_; ++i)
#define pii pair<int, int>
#define fi first
#define se second
#define mk make_pair
typedef long long ll;

using namespace std;

void File() {
  freopen("ARC074E.in", "r", stdin);
  freopen("ARC074E.out", "w", stdout);
}

template <typename T> void read(T &_) {
  T __ = 0, mul = 1;
  char ch = getchar();
  while (!isdigit(ch)) {
    if (ch == '-')
      mul = -1;
    ch = getchar();
  }
  while (isdigit(ch))
    __ = (__ << 1) + (__ << 3) + (ch ^ '0'), ch = getchar();
  _ = __ * mul;
}

const int maxn = 301;
const ll mod = 1e9 + 7;
int n, m;
vector<pii> qu[maxn];
ll dp[maxn][maxn][maxn], ans;

void init() {
  read(n);
  read(m);
  int l, r, x;
  REP(i, 1, m) {
    read(l);
    read(r);
    read(x);
    qu[r].push_back(mk(l, x));
  }
}

void work() {
  dp[0][0][0] = 1;
  REP(i, 0, n) REP(j, 0, n) REP(k, 0, n) {
    if ((i && i == j) || (j && j == k) || (k && i == k))
      continue;
    int nex = max(i, max(j, k)) + 1, r = nex - 1;
    bool flag = true;
    REP(f, 0, qu[r].size() - 1) {
      int l = qu[r][f].fi, x = qu[r][f].se, cnt = 0;
      if (i && i >= l)
        ++cnt;
      if (j && j >= l)
        ++cnt;
      if (k && k >= l)
        ++cnt;
      if (cnt != x) {
        flag = false;
        dp[i][j][k] = 0;
        break;
      }
    }
    if (!flag)
      continue;
    (dp[nex][j][k] += dp[i][j][k]) %= mod;
    (dp[i][nex][k] += dp[i][j][k]) %= mod;
    (dp[i][j][nex] += dp[i][j][k]) %= mod;
    if (r == n)
      (ans += dp[i][j][k]) %= mod;
  }
  printf("%lld\n", ans);
}

int main() {
  // File();
  init();
  work();
  return 0;
}


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

#define REP(i, a, b) for (int i = a, i##_end_ = b; i <= i##_end_; ++i)
#define pii pair<int, int>
#define fi first
#define se second
#define mk make_pair
typedef long long ll;

using namespace std;

void File() {
  freopen("ARC074E.in", "r", stdin);
  freopen("ARC074E.out", "w", stdout);
}

template <typename T> void read(T &_) {
  T __ = 0, mul = 1;
  char ch = getchar();
  while (!isdigit(ch)) {
    if (ch == '-')
      mul = -1;
    ch = getchar();
  }
  while (isdigit(ch))
    __ = (__ << 1) + (__ << 3) + (ch ^ '0'), ch = getchar();
  _ = __ * mul;
}

const int maxn = 310;
const ll mod = 1e9 + 7;
int n, m;
vector<pii> qu[maxn];
ll dp[maxn][maxn][maxn], ans;

void init() {
  read(n);
  read(m);
  int l, r, x;
  REP(i, 1, m) {
    read(l);
    read(r);
    read(x);
    qu[r].push_back(mk(l, x));
  }
}

void work() {
  dp[0][0][0] = 1;
  REP(i, 0, n) REP(j, 0, n) REP(k, 0, n) {
    if ((i && i == j) || (j && j == k) || (k && i == k))
      continue;
    int nex = max(i, max(j, k)) + 1, r = nex - 1;
    bool flag = true;
    REP(f, 0, qu[r].size() - 1) {
      int l = qu[r][f].fi, x = qu[r][f].se, cnt = 0;
      if (i && i >= l)
        ++cnt;
      if (j && j >= l)
        ++cnt;
      if (k && k >= l)
        ++cnt;
      if (cnt != x) {
        flag = false;
        dp[i][j][k] = 0;
        break;
      }
    }
    if (!flag)
      continue;
    (dp[nex][j][k] += dp[i][j][k]) %= mod;
    (dp[i][nex][k] += dp[i][j][k]) %= mod;
    (dp[i][j][nex] += dp[i][j][k]) %= mod;
    if (r == n)
      (ans += dp[i][j][k]) %= mod;
  }
  printf("%lld\n", ans);
}

int main() {
  // File();
  init();
  work();
  return 0;
}