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

#include <bits/stdc++.h>

using namespace std;
typedef long long ll;
typedef pair<ll, ll> p_ll;

template <class T> void debug(T itr1, T itr2) {
  auto now = itr1;
  while (now < itr2) {
    cout << *now << " ";
    now++;
  }
  cout << endl;
}
#define repr(i, from, to) for (ll i = (ll)from; i < (ll)to; i++)
#define all(vec) vec.begin(), vec.end()
#define rep(i, N) repr(i, 0, N)
#define per(i, N) for (int i = (int)N - 1; i >= 0; i--)

const ll MOD = pow(10, 9) + 7;
const ll LLINF = pow(2, 61) - 1;
const int INF = pow(2, 30) - 1;

vector<ll> fac;
void c_fac(int x = pow(10, 6) + 10) {
  fac.resize(x, true);
  rep(i, x) fac[i] = i ? (fac[i - 1] * i) % MOD : 1;
}
ll inv(ll a, ll m = MOD) {
  ll b = m, x = 1, y = 0;
  while (b != 0) {
    int d = a / b;
    a -= b * d;
    swap(a, b);
    x -= y * d;
    swap(x, y);
  }
  return (x + m) % m;
}
ll nck(ll n, ll k) { return fac[n] * inv(fac[k] * fac[n - k] % MOD) % MOD; }
ll gcd(ll a, ll b) {
  if (a < b)
    swap(a, b);
  return b == 0 ? a : gcd(b, a % b);
}
ll lcm(ll a, ll b) { return a / gcd(a, b) * b; }

int main() {
  ll R, C, K;
  cin >> R >> C >> K;
  static ll goods[3000][3000] = {};
  rep(i, K) {
    ll r, c, v;
    cin >> r >> c >> v;
    r--;
    c--;
    goods[r][c] = v;
  }

  static ll dp[3000][3000][4] = {};
  dp[0][0][1] = goods[0][0];
  rep(i, R) rep(j, C) rep(k, 4) {
    if (i != R - 1) {
      dp[i + 1][j][0] = max(dp[i + 1][j][0], dp[i][j][k]);
      dp[i + 1][j][1] = max(dp[i + 1][j][1], dp[i][j][k] + goods[i + 1][j]);
    }
    if (j != C - 1) {
      dp[i][j + 1][k] = max(dp[i][j + 1][k], dp[i][j][k]);
      if (k != 3)
        dp[i][j + 1][k + 1] =
            max(dp[i][j + 1][k + 1], dp[i][j][k] + goods[i][j + 1]);
    }
  }

  ll result = *max_element(dp[R - 1][C - 1], dp[R - 1][C - 1] + 4);
  cout << result << endl;
  return 0;
}


Error: -11

Fixed submission:

#include <bits/stdc++.h>

using namespace std;
typedef long long ll;
typedef pair<ll, ll> p_ll;

template <class T> void debug(T itr1, T itr2) {
  auto now = itr1;
  while (now < itr2) {
    cout << *now << " ";
    now++;
  }
  cout << endl;
}
#define repr(i, from, to) for (ll i = (ll)from; i < (ll)to; i++)
#define all(vec) vec.begin(), vec.end()
#define rep(i, N) repr(i, 0, N)
#define per(i, N) for (int i = (int)N - 1; i >= 0; i--)

const ll MOD = pow(10, 9) + 7;
const ll LLINF = pow(2, 61) - 1;
const int INF = pow(2, 30) - 1;

vector<ll> fac;
void c_fac(int x = pow(10, 6) + 10) {
  fac.resize(x, true);
  rep(i, x) fac[i] = i ? (fac[i - 1] * i) % MOD : 1;
}
ll inv(ll a, ll m = MOD) {
  ll b = m, x = 1, y = 0;
  while (b != 0) {
    int d = a / b;
    a -= b * d;
    swap(a, b);
    x -= y * d;
    swap(x, y);
  }
  return (x + m) % m;
}
ll nck(ll n, ll k) { return fac[n] * inv(fac[k] * fac[n - k] % MOD) % MOD; }
ll gcd(ll a, ll b) {
  if (a < b)
    swap(a, b);
  return b == 0 ? a : gcd(b, a % b);
}
ll lcm(ll a, ll b) { return a / gcd(a, b) * b; }

int main() {
  ll R, C, K;
  cin >> R >> C >> K;
  ll goods[3000][3000] = {};
  rep(i, K) {
    ll r, c, v;
    cin >> r >> c >> v;
    r--;
    c--;
    goods[r][c] = v;
  }

  ll dp[3000][3000][4] = {};
  dp[0][0][1] = goods[0][0];
  rep(i, R) rep(j, C) rep(k, 4) {
    if (i != R - 1) {
      dp[i + 1][j][0] = max(dp[i + 1][j][0], dp[i][j][k]);
      dp[i + 1][j][1] = max(dp[i + 1][j][1], dp[i][j][k] + goods[i + 1][j]);
    }
    if (j != C - 1) {
      dp[i][j + 1][k] = max(dp[i][j + 1][k], dp[i][j][k]);
      if (k != 3)
        dp[i][j + 1][k + 1] =
            max(dp[i][j + 1][k + 1], dp[i][j][k] + goods[i][j + 1]);
    }
  }

  ll result = *max_element(dp[R - 1][C - 1], dp[R - 1][C - 1] + 4);
  cout << result << endl;
  return 0;
}