Problem p03162 (C++)

Buggy submission (status: Time Limit Exceeded):
// author: chinmay0402
// One day your whole life will flash before your eyes, make sure you make it
// worth watching
#include <bits/stdc++.h>
using namespace std;

// policy based data structures
#include <ext/pb_ds/assoc_container.hpp>
using namespace __gnu_pbds;
typedef tree<int, null_type, less<int>, rb_tree_tag,
             tree_order_statistics_node_update>
    indexed_set;

#define ll long long int
#define lld long double
#define fl float
#define vs vector<string>
#define vll vector<ll>
#define pll pair<ll, ll>
#define vpll vector<pair<ll, ll>>
#define fst first
#define scd second
#define sll set<ll>
#define mll map<ll, ll>
#define flash                                                                  \
  ios_base::sync_with_stdio(false);                                            \
  cin.tie(NULL);
#define INF (ll)10000000000000000
#define MOD (ll)1000000007
#define pb push_back
#define msl map<string, ll>
#define test                                                                   \
  ll t;                                                                        \
  cin >> t;                                                                    \
  while (t--)
#define sortv(v) sort(v.begin(), v.end())
#define max3(a, b, c) max(a, max(b, c))
#define lcm(a, b) (a * b / __gcd(a, b))
#define all(a) a.begin(), a.end()
#define sz(a) a.size();
#define present(c, x) (c.find(x) != c.end());
#define c_sum accumulate(all(c), (ll)0);

#define forn(i, n) for (ll i = 0; i < n; i++)
#define for1(i, n) for (ll i = 1; i <= n; i++)
#define fornr(i, n) for (ll i = n - 1; i >= 0; i--)
#define forab(i, a, b, c) for (ll i = a; i <= b; i += c)

template <typename T> void read(T &x) { cin >> x; }
template <typename T, typename T1> void read(T &x, T1 &y) { cin >> x >> y; }
template <typename T, typename T1, typename T2> void read(T &x, T1 &y, T2 &z) {
  cin >> x >> y >> z;
}
template <typename T, typename T1, typename T2, typename T3>
void read(T &x, T1 &y, T2 &z, T3 &a) {
  cin >> x >> y >> z >> a;
}
template <typename T> void reada(T oneD, ll n) {
  for (ll i = 0; i < n; i++)
    cin >> oneD[i];
}
template <typename T> void readv(vector<T> &oneD, ll n) {
  forn(i, n) {
    ll x;
    read(x);
    oneD.push_back(x);
  }
}
vll graph[100001];
template <typename T> void readg(vector<T> graph[100001], ll n) {
  forn(i, n) {
    ll x, y;
    cin >> x >> y;
    graph[x].pb(y);
    graph[y].pb(x);
  }
}

#define iread1(n)                                                              \
  ll n;                                                                        \
  read(n);
#define iread2(n, m)                                                           \
  ll n, m;                                                                     \
  read(n, m);
#define iread3(x, y, z)                                                        \
  ll x, y, z;                                                                  \
  read(x, y, z);

ll gcd(ll a, ll b) {
  if (a == 0)
    return b;
  else
    return gcd(b % a, a);
}

ll gcdExt(ll a, ll b, ll &x, ll &y) {
  if (a == 0) {
    x = 0;
    y = 1;
    return b;
  }
  ll x1, y1;
  ll gcd = gcdExt(b % a, a, x1, y1);
  x = y1 - (b / a) * x1;
  y = x1;
  return gcd;
}

ll pwr(ll a, ll b) {
  ll res = 1;
  while (b > 0) {
    if (b & 1)
      res = res * a;
    a *= a;
    b >>= 1;
  }
  return res;
}

ll pwrm(ll a, ll b, ll m) {
  a %= m;
  ll res = 1;
  while (b > 0) {
    if (b & 1)
      res = res * a % m;
    a = a * a % m;
    b >>= 1;
  }
  return res;
}

ll pwrm_which_works_too(ll a, ll b, ll m) {
  a %= m;
  if (a == 0)
    return 0;
  else if (b == 0)
    return 1;
  else if (b & 1)
    return (a * pwrm(a, b / 2, m) % m * pwrm(a, b / 2, m) % m) % m;
  else
    return (pwrm(a, b / 2, m) % m * pwrm(a, b / 2, m) % m) % m;
}

ll no_of_divisors(ll n) {
  ll c = 0;
  for (ll i = 1; i <= sqrt(n); i++) {
    if (n % i == 0) {
      if (n / i == i)
        c = c + 1;
      else
        c = c + 2;
    }
  }
  return c;
}

vector<bool> sieve(1000000, true);
void Sieve() {
  sieve[0] = false;
  sieve[1] = false;
  for (ll i = 2; i * i <= 1000000; i++) {
    if (sieve[i] == true) {
      for (ll j = i * i; j < 1000000; j += i)
        sieve[j] = false;
    }
  }
}

vll sieve_spf(1000001);
void Sieve_spf() {
  ll n = 1000001;

  forn(i, n) sieve[i] = i;

  sieve[0] = -1;
  sieve[1] = -1;

  forab(i, 2, n, 2) sieve[i] = 2;

  forab(i, 3, n, 2) if (sieve[i] == i) forab(j, i * i, n, i) if (sieve[j] == j)
      sieve[j] = i;
}

bool oppositeSigns(ll x, ll y) { return ((x ^ y) < 0); }

bool isInt(ll a, ll b) {
  if ((lld)a / (lld)b == a / b)
    return true;
  else
    return false;
}

ll solve(ll curr, ll r, ll c, ll n, ll a[][3]) {
  if (r < n - 1) {
    if (c == 0) {
      ll k = max(solve(curr + a[r + 1][1], r + 1, 1, n, a),
                 solve(curr + a[r + 1][2], r + 1, 2, n, a));
      return k;
    } else if (c == 1) {
      ll k = max(solve(curr + a[r + 1][0], r + 1, 0, n, a),
                 solve(curr + a[r + 1][2], r + 1, 2, n, a));
      return k;
    } else {
      ll k = max(solve(curr + a[r + 1][1], r + 1, 1, n, a),
                 solve(curr + a[r + 1][0], r + 1, 0, n, a));
      return k;
    }
  } else {
    return curr;
  }
}
int main() {

#ifdef ENABLE_FILE_IO
  freopen("in", "r", stdin);
  freopen("out", "w", stdout);
#endif

  // START OF PROGRAM LOGIC
  flash iread1(n);
  ll a[n][3];
  for (ll i = 0; i < n; i++) {
    for (ll j = 0; j < 3; j++) {
      cin >> a[i][j];
    }
  }
  cout << max(solve(0, -1, 0, n, a),
              max(solve(0, -1, 1, n, a), solve(0, -1, 2, n, a)))
       << "\n";
  // END OF PROGRAM LOGIC

  return 0;
}


Fixed submission:
// author: chinmay0402
// One day your whole life will flash before your eyes, make sure you make it
// worth watching
#include <bits/stdc++.h>
using namespace std;

// policy based data structures
#include <ext/pb_ds/assoc_container.hpp>
using namespace __gnu_pbds;
typedef tree<int, null_type, less<int>, rb_tree_tag,
             tree_order_statistics_node_update>
    indexed_set;

#define ll long long int
#define lld long double
#define fl float
#define vs vector<string>
#define vll vector<ll>
#define pll pair<ll, ll>
#define vpll vector<pair<ll, ll>>
#define fst first
#define scd second
#define sll set<ll>
#define mll map<ll, ll>
#define flash                                                                  \
  ios_base::sync_with_stdio(false);                                            \
  cin.tie(NULL);
#define INF (ll)10000000000000000
#define MOD (ll)1000000007
#define pb push_back
#define msl map<string, ll>
#define test                                                                   \
  ll t;                                                                        \
  cin >> t;                                                                    \
  while (t--)
#define sortv(v) sort(v.begin(), v.end())
#define max3(a, b, c) max(a, max(b, c))
#define lcm(a, b) (a * b / __gcd(a, b))
#define all(a) a.begin(), a.end()
#define sz(a) a.size();
#define present(c, x) (c.find(x) != c.end());
#define c_sum accumulate(all(c), (ll)0);

#define forn(i, n) for (ll i = 0; i < n; i++)
#define for1(i, n) for (ll i = 1; i <= n; i++)
#define fornr(i, n) for (ll i = n - 1; i >= 0; i--)
#define forab(i, a, b, c) for (ll i = a; i <= b; i += c)

template <typename T> void read(T &x) { cin >> x; }
template <typename T, typename T1> void read(T &x, T1 &y) { cin >> x >> y; }
template <typename T, typename T1, typename T2> void read(T &x, T1 &y, T2 &z) {
  cin >> x >> y >> z;
}
template <typename T, typename T1, typename T2, typename T3>
void read(T &x, T1 &y, T2 &z, T3 &a) {
  cin >> x >> y >> z >> a;
}
template <typename T> void reada(T oneD, ll n) {
  for (ll i = 0; i < n; i++)
    cin >> oneD[i];
}
template <typename T> void readv(vector<T> &oneD, ll n) {
  forn(i, n) {
    ll x;
    read(x);
    oneD.push_back(x);
  }
}
vll graph[100001];
template <typename T> void readg(vector<T> graph[100001], ll n) {
  forn(i, n) {
    ll x, y;
    cin >> x >> y;
    graph[x].pb(y);
    graph[y].pb(x);
  }
}

#define iread1(n)                                                              \
  ll n;                                                                        \
  read(n);
#define iread2(n, m)                                                           \
  ll n, m;                                                                     \
  read(n, m);
#define iread3(x, y, z)                                                        \
  ll x, y, z;                                                                  \
  read(x, y, z);

ll gcd(ll a, ll b) {
  if (a == 0)
    return b;
  else
    return gcd(b % a, a);
}

ll gcdExt(ll a, ll b, ll &x, ll &y) {
  if (a == 0) {
    x = 0;
    y = 1;
    return b;
  }
  ll x1, y1;
  ll gcd = gcdExt(b % a, a, x1, y1);
  x = y1 - (b / a) * x1;
  y = x1;
  return gcd;
}

ll pwr(ll a, ll b) {
  ll res = 1;
  while (b > 0) {
    if (b & 1)
      res = res * a;
    a *= a;
    b >>= 1;
  }
  return res;
}

ll pwrm(ll a, ll b, ll m) {
  a %= m;
  ll res = 1;
  while (b > 0) {
    if (b & 1)
      res = res * a % m;
    a = a * a % m;
    b >>= 1;
  }
  return res;
}

ll pwrm_which_works_too(ll a, ll b, ll m) {
  a %= m;
  if (a == 0)
    return 0;
  else if (b == 0)
    return 1;
  else if (b & 1)
    return (a * pwrm(a, b / 2, m) % m * pwrm(a, b / 2, m) % m) % m;
  else
    return (pwrm(a, b / 2, m) % m * pwrm(a, b / 2, m) % m) % m;
}

ll no_of_divisors(ll n) {
  ll c = 0;
  for (ll i = 1; i <= sqrt(n); i++) {
    if (n % i == 0) {
      if (n / i == i)
        c = c + 1;
      else
        c = c + 2;
    }
  }
  return c;
}

vector<bool> sieve(1000000, true);
void Sieve() {
  sieve[0] = false;
  sieve[1] = false;
  for (ll i = 2; i * i <= 1000000; i++) {
    if (sieve[i] == true) {
      for (ll j = i * i; j < 1000000; j += i)
        sieve[j] = false;
    }
  }
}

vll sieve_spf(1000001);
void Sieve_spf() {
  ll n = 1000001;

  forn(i, n) sieve[i] = i;

  sieve[0] = -1;
  sieve[1] = -1;

  forab(i, 2, n, 2) sieve[i] = 2;

  forab(i, 3, n, 2) if (sieve[i] == i) forab(j, i * i, n, i) if (sieve[j] == j)
      sieve[j] = i;
}

bool oppositeSigns(ll x, ll y) { return ((x ^ y) < 0); }

bool isInt(ll a, ll b) {
  if ((lld)a / (lld)b == a / b)
    return true;
  else
    return false;
}

ll solve(ll curr, ll r, ll c, ll n, ll a[][3]) {
  if (r < n - 1) {
    if (c == 0) {
      ll k = max(solve(curr + a[r + 1][1], r + 1, 1, n, a),
                 solve(curr + a[r + 1][2], r + 1, 2, n, a));
      return k;
    } else if (c == 1) {
      ll k = max(solve(curr + a[r + 1][0], r + 1, 0, n, a),
                 solve(curr + a[r + 1][2], r + 1, 2, n, a));
      return k;
    } else {
      ll k = max(solve(curr + a[r + 1][1], r + 1, 1, n, a),
                 solve(curr + a[r + 1][0], r + 1, 0, n, a));
      return k;
    }
  } else {
    return curr;
  }
}
int main() {

#ifdef ENABLE_FILE_IO
  freopen("in", "r", stdin);
  freopen("out", "w", stdout);
#endif

  // START OF PROGRAM LOGIC
  flash iread1(n);
  ll a[n][3];
  for (ll i = 0; i < n; i++) {
    for (ll j = 0; j < 3; j++) {
      cin >> a[i][j];
    }
  }
  ll h[n], b[n], s[n];
  h[0] = a[0][2];
  s[0] = a[0][0];
  b[0] = a[0][1];
  for (ll i = 1; i < n; i++) {
    h[i] = a[i][2] + max(b[i - 1], s[i - 1]);
    s[i] = a[i][0] + max(b[i - 1], h[i - 1]);
    b[i] = a[i][1] + max(h[i - 1], s[i - 1]);
  }
  cout << max(h[n - 1], max(b[n - 1], s[n - 1])) << "\n";
  // END OF PROGRAM LOGIC

  return 0;
}