Problem p03717 (C++)

Buggy submission (status: Memory Limit Exceeded):
#include <bits/stdc++.h>

using namespace std;

using LL = long long;
using PII = pair<int, int>;
using ll = long long;
using DBL = double;
using VI = vector<int>;
using VD = vector<DBL>;
using VVI = vector<VI>;
using VVD = vector<VD>;
#define FOR(i, a, b) for (int i = a; i < b; i++)
#define REP(i, n) FOR(i, 0, n)
#define SZ(a) ((int)((a).size()))
#define ALL(x) (x).begin(), (x).end()
#define SET(a, v) memset((a), (v), sizeof(a))
#define EB emplace_back #define PB push_back
#define MP make_pair #define ST first #define ND second

#define trace(...)                                                             \
  { __f(#__VA_ARGS__, __VA_ARGS__); }
template <typename Arg> void __f(const char *name, Arg &&arg) {
  cerr << name << " = " << arg << std::endl;
}
template <typename Arg1, typename... Args>
void __f(const char *names, Arg1 &&arg1, Args &&...args) {
  const char *comma = strchr(names + 1, ',');
  cerr.write(names, comma - names) << " = " << arg1 << " | ";
  __f(comma + 1, args...);
}
// #include <ext/pb_ds/assoc_container.hpp>
// #include <ext/pb_ds/tree_policy.hpp>
// using namespace __gnu_pbds; // OST: find_by_order, order_of_key
// typedef tree<int, null_type, less<int>, rb_tree_tag,
// tree_order_statistics_node_update> ordered_set; #pragma GCC optimize("Ofast")
// optimize("unroll-loops")
// target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
// /*** RNGS ***/
// SEED=chrono::steady_clock::now().time_since_epoch().count();
// // or high_resolution_clock
// mt19937 rng(SEED); /*or*/ random_device rd; mt19937 rng(rd());
// uniform_int_distribution<> dis(MIN, MAX);// usage: dis(rng)
// struct chash {int operator()(int x) const {return x^SEED;}};
// gp_hash_table<int,int,chash>m;//use cc if very less updates
// /*** FAST IO ***/
// inline int scan(){ bool y=0; int x=0; char c=getchar_unlocked();
// while(c<'0'||c>'9'){ if(c=='-')y=1; c=getchar_unlocked();}
// while(c>='0'&&c<='9'){x=(x<<1)+(x<<3)+c-'0';c=getchar_unlocked();}
// return y?-x:x; }

vector<int> v[512];
int l[512], r[512], x[512];
int dp[512][512][512];
const int MOD = 1000000007;

int calc(int pos, int r, int g, int b) {
  int &y = dp[r][g][b];
  if (y != -1)
    return y;
  y = 0;
  bool valid = true;
  for (auto &z : v[pos]) {
    int R = ::r[z];
    int X = x[z];
    valid &= ((X) == ((r <= R) + (g <= R) + (b <= R)));
  }
  if (pos == 0) {
    // trace(pos, r, g, b, valid);
    return y = valid;
  }
  if (valid) {
    y += calc(pos - 1, pos, g, b);
    if (y >= MOD)
      y -= MOD;
    y += calc(pos - 1, r, pos, b);
    if (y >= MOD)
      y -= MOD;
    y += calc(pos - 1, r, g, pos);
    if (y >= MOD)
      y -= MOD;
  }
  // trace(pos, r, g, b, y);
  return y;
}

int main() {
  ios::sync_with_stdio(false);
  cin.tie(NULL);
  cout.tie(NULL);
  int n, m;
  cin >> n >> m;
  SET(dp, -1);
  for (int i = 1; i <= m; ++i) {
    cin >> l[i] >> r[i] >> x[i];
    v[l[i] - 1].push_back(i);
  }
  cout << calc(n, n + 1, n + 1, n + 1) << endl;
  return 0;
}

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

using namespace std;

using LL = long long;
using PII = pair<int, int>;
using ll = long long;
using DBL = double;
using VI = vector<int>;
using VD = vector<DBL>;
using VVI = vector<VI>;
using VVD = vector<VD>;
#define FOR(i, a, b) for (int i = a; i < b; i++)
#define REP(i, n) FOR(i, 0, n)
#define SZ(a) ((int)((a).size()))
#define ALL(x) (x).begin(), (x).end()
#define SET(a, v) memset((a), (v), sizeof(a))
#define EB emplace_back #define PB push_back
#define MP make_pair #define ST first #define ND second

#define trace(...)                                                             \
  { __f(#__VA_ARGS__, __VA_ARGS__); }
template <typename Arg> void __f(const char *name, Arg &&arg) {
  cerr << name << " = " << arg << std::endl;
}
template <typename Arg1, typename... Args>
void __f(const char *names, Arg1 &&arg1, Args &&...args) {
  const char *comma = strchr(names + 1, ',');
  cerr.write(names, comma - names) << " = " << arg1 << " | ";
  __f(comma + 1, args...);
}
// #include <ext/pb_ds/assoc_container.hpp>
// #include <ext/pb_ds/tree_policy.hpp>
// using namespace __gnu_pbds; // OST: find_by_order, order_of_key
// typedef tree<int, null_type, less<int>, rb_tree_tag,
// tree_order_statistics_node_update> ordered_set; #pragma GCC optimize("Ofast")
// optimize("unroll-loops")
// target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
// /*** RNGS ***/
// SEED=chrono::steady_clock::now().time_since_epoch().count();
// // or high_resolution_clock
// mt19937 rng(SEED); /*or*/ random_device rd; mt19937 rng(rd());
// uniform_int_distribution<> dis(MIN, MAX);// usage: dis(rng)
// struct chash {int operator()(int x) const {return x^SEED;}};
// gp_hash_table<int,int,chash>m;//use cc if very less updates
// /*** FAST IO ***/
// inline int scan(){ bool y=0; int x=0; char c=getchar_unlocked();
// while(c<'0'||c>'9'){ if(c=='-')y=1; c=getchar_unlocked();}
// while(c>='0'&&c<='9'){x=(x<<1)+(x<<3)+c-'0';c=getchar_unlocked();}
// return y?-x:x; }

vector<int> v[302];
int l[302], r[302], x[302];
int dp[302][302][302];
const int MOD = 1000000007;

int calc(int pos, int r, int g, int b) {
  int &y = dp[r][g][b];
  if (y != -1)
    return y;
  y = 0;
  bool valid = true;
  for (auto &z : v[pos]) {
    int R = ::r[z];
    int X = x[z];
    valid &= ((X) == ((r <= R) + (g <= R) + (b <= R)));
  }
  if (pos == 0) {
    // trace(pos, r, g, b, valid);
    return y = valid;
  }
  if (valid) {
    y += calc(pos - 1, pos, g, b);
    if (y >= MOD)
      y -= MOD;
    y += calc(pos - 1, r, pos, b);
    if (y >= MOD)
      y -= MOD;
    y += calc(pos - 1, r, g, pos);
    if (y >= MOD)
      y -= MOD;
  }
  // trace(pos, r, g, b, y);
  return y;
}

int main() {
  ios::sync_with_stdio(false);
  cin.tie(NULL);
  cout.tie(NULL);
  int n, m;
  cin >> n >> m;
  SET(dp, -1);
  for (int i = 1; i <= m; ++i) {
    cin >> l[i] >> r[i] >> x[i];
    v[l[i] - 1].push_back(i);
  }
  cout << calc(n, n + 1, n + 1, n + 1) << endl;
  return 0;
}