Problem p01861 (C++) — buggy submission, verdict: Time Limit Exceeded

#include <bits/stdc++.h>
using namespace std;

#define dump(...) cout << "# " << #__VA_ARGS__ << '=' << (__VA_ARGS__) << endl
#define repi(i, a, b) for (int i = int(a); i < int(b); i++)
#define peri(i, a, b) for (int i = int(b); i-- > int(a);)
#define rep(i, n) repi(i, 0, n)
#define per(i, n) peri(i, 0, n)
#define all(c) begin(c), end(c)
#define mp make_pair
#define mt make_tuple

typedef unsigned int uint;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int, int> pii;
typedef vector<int> vi;
typedef vector<vi> vvi;
typedef vector<ll> vl;
typedef vector<vl> vvl;
typedef vector<double> vd;
typedef vector<vd> vvd;
typedef vector<string> vs;

template <typename T1, typename T2>
ostream &operator<<(ostream &os, const pair<T1, T2> &p) {
  return os << '(' << p.first << ',' << p.second << ')';
}

template <typename Tuple> void print_tuple(ostream &, const Tuple &) {}
template <typename Car, typename... Cdr, typename Tuple>
void print_tuple(ostream &os, const Tuple &t) {
  print_tuple<Cdr...>(os, t);
  os << (sizeof...(Cdr) ? "," : "") << get<sizeof...(Cdr)>(t);
}
template <typename... Args>
ostream &operator<<(ostream &os, const tuple<Args...> &t) {
  print_tuple<Args...>(os << '(', t);
  return os << ')';
}

template <typename Ch, typename Tr, typename C>
basic_ostream<Ch, Tr> &operator<<(basic_ostream<Ch, Tr> &os, const C &c) {
  os << '[';
  for (auto i = begin(c); i != end(c); ++i)
    os << (i == begin(c) ? "" : " ") << *i;
  return os << ']';
}

constexpr int INF = 1e9;
constexpr int MOD = 1e9 + 7;
constexpr double EPS = 1e-9;

int solve(int i, int l, int r, const vi &xs, const vi &as, const vi &bs,
          const vi &cs, vector<vvi> &memo) {
  if (memo[i][l][r] != -1)
    return memo[i][l][r];
  if (r - l == 1)
    return memo[i][l][r] = (as[i] == xs[l]);
  repi(p, l + 1, r) if (solve(bs[i], l, p, xs, as, bs, cs, memo) &&
                        solve(cs[i], p, r, xs, as, bs, cs,
                              memo)) return memo[i][l][r] = true;
  return memo[i][l][r] = false;
}

int main() {
  for (int n; cin >> n && n;) {
    vi xs(n);
    rep(i, n) cin >> xs[i];
    int m;
    cin >> m;
    vi as(m), bs(m), cs(m);
    rep(i, m) cin >> as[i] >> bs[i] >> cs[i], bs[i]--, cs[i]--;
    vector<vvi> memo(m, vvi(n + 1, vi(n + 1, -1)));
    cout << (solve(0, 0, n, xs, as, bs, cs, memo) ? "Yes" : "No") << endl;
  }
}

Error: TLE

Fixed submission:

#include <bits/stdc++.h>
using namespace std;

#define dump(...) cout << "# " << #__VA_ARGS__ << '=' << (__VA_ARGS__) << endl
#define repi(i, a, b) for (int i = int(a); i < int(b); i++)
#define peri(i, a, b) for (int i = int(b); i-- > int(a);)
#define rep(i, n) repi(i, 0, n)
#define per(i, n) peri(i, 0, n)
#define all(c) begin(c), end(c)
#define mp make_pair
#define mt make_tuple

typedef unsigned int uint;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int, int> pii;
typedef vector<int> vi;
typedef vector<vi> vvi;
typedef vector<ll> vl;
typedef vector<vl> vvl;
typedef vector<double> vd;
typedef vector<vd> vvd;
typedef vector<string> vs;

template <typename T1, typename T2>
ostream &operator<<(ostream &os, const pair<T1, T2> &p) {
  return os << '(' << p.first << ',' << p.second << ')';
}

template <typename Tuple> void print_tuple(ostream &, const Tuple &) {}
template <typename Car, typename... Cdr, typename Tuple>
void print_tuple(ostream &os, const Tuple &t) {
  print_tuple<Cdr...>(os, t);
  os << (sizeof...(Cdr) ? "," : "") << get<sizeof...(Cdr)>(t);
}
template <typename... Args>
ostream &operator<<(ostream &os, const tuple<Args...> &t) {
  print_tuple<Args...>(os << '(', t);
  return os << ')';
}

template <typename Ch, typename Tr, typename C>
basic_ostream<Ch, Tr> &operator<<(basic_ostream<Ch, Tr> &os, const C &c) {
  os << '[';
  for (auto i = begin(c); i != end(c); ++i)
    os << (i == begin(c) ? "" : " ") << *i;
  return os << ']';
}

constexpr int INF = 1e9;
constexpr int MOD = 1e9 + 7;
constexpr double EPS = 1e-9;

int solve(int i, int l, int r, const vi &xs, const vi &as, const vi &bs,
          const vi &cs, vector<vvi> &memo) {
  if (memo[i][l][r] != -1)
    return memo[i][l][r];
  if (r - l == 1)
    return memo[i][l][r] = (as[i] == xs[l]);
  repi(p, l + 1, r) if (solve(bs[i], l, p, xs, as, bs, cs, memo) &&
                        solve(cs[i], p, r, xs, as, bs, cs,
                              memo)) return memo[i][l][r] = true;
  return false;
}

int main() {
  for (int n; cin >> n && n;) {
    vi xs(n);
    rep(i, n) cin >> xs[i];
    int m;
    cin >> m;
    vi as(m), bs(m), cs(m);
    rep(i, m) cin >> as[i] >> bs[i] >> cs[i], bs[i]--, cs[i]--;
    vector<vvi> memo(m, vvi(n + 1, vi(n + 1, -1)));
    cout << (solve(0, 0, n, xs, as, bs, cs, memo) ? "Yes" : "No") << endl;
  }
}