Problem p02586 (C++) — buggy submission, verdict: Runtime Error

/* winners never quit and quitters never win.
      #swap                                 */

#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
using namespace std;
using namespace __gnu_pbds;
#pragma GCC optimize("-O3")
using ll = long long;
using ld = long double;
const ll mod = 1000000007;
const ll inf = 1000000000000000000;
const ll rk = 256;
const ld PI = 3.141592653589793;

typedef tree<int, null_type, less<int>, rb_tree_tag,
             tree_order_statistics_node_update>
    ordered_set;

template <typename T> void make_unique(vector<T> &vec) {
  sort(all(vec));
  vec.erase(unique(all(vec)), vec.end());
}

#define endl '\\n'
#define pb push_back
#define mp make_pair
#define vc vector
#define fs first
#define sec second
#define pq priority_queue
#define lb lower_bound
#define ub upper_bound
#define pll pair<ll, ll>
#define pls pair<ll, string>
#define psl pair<string, ll>
#define plc pair<ll, char>
#define pcl pair<char, ll>
#define pss pair<string, string>
#define all(x) (x).begin(), (x).end()
#define tol(s) transform(s.begin(), s.end(), s.begin(), ::tolower);
#define tou(s) transform(s.begin(), s.end(), s.begin(), ::toupper);
#define printclock                                                             \\
  cerr << "Time : " << 1000 * (ld)clock() / (ld)CLOCKS_PER_SEC << "ms\\n";

#define error(args...)                                                         \\
  {                                                                            \\
    string _s = #args;                                                         \\
    replace(_s.begin(), _s.end(), ',', ' ');                                   \\
    stringstream _ss(_s);                                                      \\
    istream_iterator<string> _it(_ss);                                         \\
    err(_it, args);                                                            \\
  }

#define rep(i, begin, end)                                                     \\
  for (__typeof(end) i = (begin) - ((begin) > (end));                          \\
       i != (end) - ((begin) > (end)); i += 1 - 2 * ((begin) > (end)))
#define T                                                                      \\
  ll t = 0;                                                                    \\
  cin >> t;                                                                    \\
  for (ll test = 0; test < t; test++)

mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());

ll nxt() {
  ll TemporaryVariable;
  cin >> TemporaryVariable;
  return TemporaryVariable;
}

struct custom_hash {
  static uint64_t splitmix64(uint64_t x) {
    // http://xorshift.di.unimi.it/splitmix64.c
    x += 0x9e3779b97f4a7c15;
    x = (x ^ (x >> 30)) * 0xbf58476d1ce4e5b9;
    x = (x ^ (x >> 27)) * 0x94d049bb133111eb;
    return x ^ (x >> 31);
  }

  size_t operator()(uint64_t x) const {
    static const uint64_t FIXED_RANDOM =
        chrono::steady_clock::now().time_since_epoch().count();
    return splitmix64(x + FIXED_RANDOM);
  }
};

ll dp[3005][3005][4];

int32_t main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  // isprime();
  // coeff();
  /*freopen("input.txt", "r", stdin);
freopen("output.txt", "w", stdout);*/
  /*rlimit rlim;
  if (getrlimit(RLIMIT_STACK, &rlim)) return 1;
  rlim.rlim_cur = rlim.rlim_max;
  if (setrlimit(RLIMIT_STACK, &rlim)) return 2;*/
  ll n = nxt(), m = nxt(), k = nxt();
  ll v[n][m];
  rep(a, 0, n) rep(b, 0, m) v[a][b] = 0;
  rep(a, 0, k) {
    ll p = nxt() - 1, q = nxt() - 1, r = nxt();
    v[p][q] = r;
  }

  rep(a, 0, n) {
    rep(b, 0, m) {
      rep(c, 0, 4) { dp[a][b][c] = 0; }
    }
  }
  if (v[0][0] > 0)
    dp[0][0][1] = v[0][0];
  rep(a, 0, n) {
    rep(b, 0, m) {
      if (b) {
        dp[a][b][0] = dp[a][b - 1][0];
        dp[a][b][1] = dp[a][b - 1][1];
        dp[a][b][2] = dp[a][b - 1][2];
        dp[a][b][3] = dp[a][b - 1][3];
        if (v[a][b] > 0) {
          dp[a][b][1] = max(dp[a][b][1], dp[a][b - 1][0] + v[a][b]);
          dp[a][b][2] = max(dp[a][b][2], dp[a][b - 1][1] + v[a][b]);
          dp[a][b][3] = max(dp[a][b][3], dp[a][b - 1][2] + v[a][b]);
        }
      }
      if (a) {
        rep(c, 0, 4) {
          dp[a][b][0] = max(dp[a][b][0], dp[a - 1][b][c]);
          if (v[a][b] > 0) {
            dp[a][b][1] = max(dp[a][b][1], dp[a - 1][b][c] + v[a][b]);
          }
        }
      }
    }
  }
  ll ans = 0;
  rep(a, 0, 4) ans = max(ans, dp[n - 1][m - 1][a]);
  cout << ans << endl;
  printclock;
  return 0;
}


Error: WA

Fixed submission:

/* winners never quit and quitters never win.
      #swap                                 */

#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
using namespace std;
using namespace __gnu_pbds;
#pragma GCC optimize("-O3")
using ll = long long;
using ld = long double;
const ll mod = 1000000007;
const ll inf = 1000000000000000000;
const ll rk = 256;
const ld PI = 3.141592653589793;

typedef tree<int, null_type, less<int>, rb_tree_tag,
             tree_order_statistics_node_update>
    ordered_set;

template <typename T> void make_unique(vector<T> &vec) {
  sort(all(vec));
  vec.erase(unique(all(vec)), vec.end());
}

#define endl '\\n'
#define pb push_back
#define mp make_pair
#define vc vector
#define fs first
#define sec second
#define pq priority_queue
#define lb lower_bound
#define ub upper_bound
#define pll pair<ll, ll>
#define pls pair<ll, string>
#define psl pair<string, ll>
#define plc pair<ll, char>
#define pcl pair<char, ll>
#define pss pair<string, string>
#define all(x) (x).begin(), (x).end()
#define tol(s) transform(s.begin(), s.end(), s.begin(), ::tolower);
#define tou(s) transform(s.begin(), s.end(), s.begin(), ::toupper);
#define printclock                                                             \\
  cerr << "Time : " << 1000 * (ld)clock() / (ld)CLOCKS_PER_SEC << "ms\\n";

#define error(args...)                                                         \\
  {                                                                            \\
    string _s = #args;                                                         \\
    replace(_s.begin(), _s.end(), ',', ' ');                                   \\
    stringstream _ss(_s);                                                      \\
    istream_iterator<string> _it(_ss);                                         \\
    err(_it, args);                                                            \\
  }

#define rep(i, begin, end)                                                     \\
  for (__typeof(end) i = (begin) - ((begin) > (end));                          \\
       i != (end) - ((begin) > (end)); i += 1 - 2 * ((begin) > (end)))
#define T                                                                      \\
  ll t = 0;                                                                    \\
  cin >> t;                                                                    \\
  for (ll test = 0; test < t; test++)

mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());

ll nxt() {
  ll TemporaryVariable;
  cin >> TemporaryVariable;
  return TemporaryVariable;
}

struct custom_hash {
  static uint64_t splitmix64(uint64_t x) {
    // http://xorshift.di.unimi.it/splitmix64.c
    x += 0x9e3779b97f4a7c15;
    x = (x ^ (x >> 30)) * 0xbf58476d1ce4e5b9;
    x = (x ^ (x >> 27)) * 0x94d049bb133111eb;
    return x ^ (x >> 31);
  }

  size_t operator()(uint64_t x) const {
    static const uint64_t FIXED_RANDOM =
        chrono::steady_clock::now().time_since_epoch().count();
    return splitmix64(x + FIXED_RANDOM);
  }
};

int32_t main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  // isprime();
  // coeff();
  /*freopen("input.txt", "r", stdin);
freopen("output.txt", "w", stdout);*/
  /*rlimit rlim;
  if (getrlimit(RLIMIT_STACK, &rlim)) return 1;
  rlim.rlim_cur = rlim.rlim_max;
  if (setrlimit(RLIMIT_STACK, &rlim)) return 2;*/
  ll n = nxt(), m = nxt(), k = nxt();
  ll v[n][m];
  rep(a, 0, n) rep(b, 0, m) v[a][b] = 0;
  rep(a, 0, k) { v[nxt() - 1][nxt() - 1] = nxt(); }
  ll dp[n][m][4];
  rep(a, 0, n) {
    rep(b, 0, m) {
      rep(c, 0, 4) { dp[a][b][c] = 0; }
    }
  }
  if (v[0][0] > 0)
    dp[0][0][1] = v[0][0];
  rep(a, 0, n) {
    rep(b, 0, m) {
      if (b) {
        dp[a][b][0] = dp[a][b - 1][0];
        dp[a][b][1] = dp[a][b - 1][1];
        dp[a][b][2] = dp[a][b - 1][2];
        dp[a][b][3] = dp[a][b - 1][3];
        if (v[a][b] > 0) {
          dp[a][b][1] = max(dp[a][b][1], dp[a][b - 1][0] + v[a][b]);
          dp[a][b][2] = max(dp[a][b][2], dp[a][b - 1][1] + v[a][b]);
          dp[a][b][3] = max(dp[a][b][3], dp[a][b - 1][2] + v[a][b]);
        }
      }
      if (a) {
        rep(c, 0, 4) {
          dp[a][b][0] = max(dp[a][b][0], dp[a - 1][b][c]);
          if (v[a][b] > 0) {
            dp[a][b][1] = max(dp[a][b][1], dp[a - 1][b][c] + v[a][b]);
          }
        }
      }
    }
  }
  ll ans = 0;
  rep(a, 0, 4) ans = max(ans, dp[n - 1][m - 1][a]);
  cout << ans << endl;
  printclock;
  return 0;
}