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

#include <bits/stdc++.h> // This will work only for g++ compiler.
#include <ext/pb_ds/assoc_container.hpp> // Used to include policy based data structure
using namespace __gnu_pbds;              // Only for g++ compiler
using namespace std;

#define for0(i, n) for (int i = 0; i < (int)(n); ++i)  // 0 based indexing
#define for1(i, n) for (int i = 1; i <= (int)(n); ++i) // 1 based indexing
#define forc(i, l, r)                                                          \\
  for (int i = (int)(l); i <= (int)(r);                                        \\
       ++i) // closed interver from l to r r inclusive
#define forr0(i, n) for (int i = (int)(n)-1; i >= 0; --i) // reverse 0 based.
#define forr1(i, n) for (int i = (int)(n); i >= 1; --i)   // reverse 1 based
// #define max(a, b)  (a > b) ?a :b  // max of 2 elements
#define min(a, b) (a < b) ? a : b // min of 2 elements

// short hand for usual tokens
#define pb push_back
#define fi first
#define se second
#define mp make_pair
#define mii map<int, int>
#define pqb priority_queue<int>                   // Max Heap
#define pqs priority_queue<int, vi, greater<int>> // Min Heap
#define setbits(x)                                                             \\
  __builtin_popcountll(                                                        \\
      x) // returns the number of set bits in the binary representation of x
#define zrobits(x)                                                             \\
  __builtin_ctzll(x) // returns the number of zeroes before the first set bit in
                     // the binary representation of x
#define mod 1000000007                            // 1e9 + 7
#define inf 1e18                                  // pow(10, 18)
#define mk(arr, n, type) type *arr = new type[n]; // generates a dynamic array
#define w(x)                                                                   \\
  int x;                                                                       \\
  cin >> x;                                                                    \\
  while (x--) // for taking test cases
mt19937 rng(chrono::steady_clock::now()
                .time_since_epoch()
                .count()); // used with shuffle

// to be used with algorithms that processes a container Eg: find(all(c),42)
#define all(x) (x).begin(), (x).end()  // Forward traversal
#define rall(x) (x).rbegin, (x).rend() // reverse traversal

// traversal function to avoid long template definition. Now with C++11 auto
// alleviates the pain.
#define tr(c, i)                                                               \\
  for (__typeof__((c)).begin() i = (c).begin(); i != (c).end(); i++)

// find if a given value is present in a container. Container version. Runs in
// log(n) for set and map
#define present(c, x) ((c).find(x) != (c).end())

// find version works for all containers. This is present in std namespace.
#define cpresent(c, x) (find(all(c), x) != (c).end())

// Avoiding wrap around of size()-1 where size is a unsigned int.
#define sz(a) int((a).size())

typedef tree<int, null_type, less<int>, rb_tree_tag,
             tree_order_statistics_node_update>
    pbds; // Used to implement policy-based data structure

// Shorthand for commonly used types
typedef vector<int> vi;
typedef vector<vi> vvi;
typedef pair<int, int> ii;
typedef vector<ii> vii;
typedef long long ll;
typedef vector<ll> vll;
typedef vector<vll> vvll;
typedef double ld;

ll moduloMultiplication(ll a, ll b) {
  ll res = 0;
  a %= mod;

  while (b) {
    if (b & 1)
      res = (res + a) % mod;

    a = (2 * a) % mod;
    b >>= 1;
  }

  return res;
}
ll dp[3010][4][3010] = {0}, grid[3010][3010] = {0};
int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  cout.precision(10);
  cout << fixed;

  ll r, c, k;
  cin >> r;
  cin >> c;
  cin >> k;
  ll x, y;
  for0(i, k) {
    cin >> x;
    cin >> y;
    cin >> grid[x][y];
  }

  for (int i = 1; i <= r; i++) {
    for (int j = 1; j <= c; j++) {
      dp[i][1][j] =
          max(max(dp[i - 1][1][j], max(dp[i - 1][2][j], dp[i - 1][3][j])) +
                  grid[i][j],
              dp[i][1][j - 1]);
      dp[i][2][j] = max(dp[i][1][j - 1] + grid[i][j], dp[i][2][j - 1]);
      dp[i][3][j] = max(dp[i][2][j - 1] + grid[i][j], dp[i][3][j - 1]);
    }
  }
  cout << max(max(dp[r][1][c], dp[r][2][c]), dp[r][3][c]);

  return 0;
}


Error: -11

Fixed submission:

#include <bits/stdc++.h> // This will work only for g++ compiler.
#include <ext/pb_ds/assoc_container.hpp> // Used to include policy based data structure
using namespace __gnu_pbds;              // Only for g++ compiler
using namespace std;

#define for0(i, n) for (int i = 0; i < (int)(n); ++i)  // 0 based indexing
#define for1(i, n) for (int i = 1; i <= (int)(n); ++i) // 1 based indexing
#define forc(i, l, r)                                                          \\
  for (int i = (int)(l); i <= (int)(r);                                        \\
       ++i) // closed interver from l to r r inclusive
#define forr0(i, n) for (int i = (int)(n)-1; i >= 0; --i) // reverse 0 based.
#define forr1(i, n) for (int i = (int)(n); i >= 1; --i)   // reverse 1 based
// #define max(a, b)  (a > b) ?a :b  // max of 2 elements
#define min(a, b) (a < b) ? a : b // min of 2 elements

// short hand for usual tokens
#define pb push_back
#define fi first
#define se second
#define mp make_pair
#define mii map<int, int>
#define pqb priority_queue<int>                   // Max Heap
#define pqs priority_queue<int, vi, greater<int>> // Min Heap
#define setbits(x)                                                             \\
  __builtin_popcountll(                                                        \\
      x) // returns the number of set bits in the binary representation of x
#define zrobits(x)                                                             \\
  __builtin_ctzll(x) // returns the number of zeroes before the first set bit in
                     // the binary representation of x
#define mod 1000000007                            // 1e9 + 7
#define inf 1e18                                  // pow(10, 18)
#define mk(arr, n, type) type *arr = new type[n]; // generates a dynamic array
#define w(x)                                                                   \\
  int x;                                                                       \\
  cin >> x;                                                                    \\
  while (x--) // for taking test cases
mt19937 rng(chrono::steady_clock::now()
                .time_since_epoch()
                .count()); // used with shuffle

// to be used with algorithms that processes a container Eg: find(all(c),42)
#define all(x) (x).begin(), (x).end()  // Forward traversal
#define rall(x) (x).rbegin, (x).rend() // reverse traversal

// traversal function to avoid long template definition. Now with C++11 auto
// alleviates the pain.
#define tr(c, i)                                                               \\
  for (__typeof__((c)).begin() i = (c).begin(); i != (c).end(); i++)

// find if a given value is present in a container. Container version. Runs in
// log(n) for set and map
#define present(c, x) ((c).find(x) != (c).end())

// find version works for all containers. This is present in std namespace.
#define cpresent(c, x) (find(all(c), x) != (c).end())

// Avoiding wrap around of size()-1 where size is a unsigned int.
#define sz(a) int((a).size())

typedef tree<int, null_type, less<int>, rb_tree_tag,
             tree_order_statistics_node_update>
    pbds; // Used to implement policy-based data structure

// Shorthand for commonly used types
typedef vector<int> vi;
typedef vector<vi> vvi;
typedef pair<int, int> ii;
typedef vector<ii> vii;
typedef long long ll;
typedef vector<ll> vll;
typedef vector<vll> vvll;
typedef double ld;

ll moduloMultiplication(ll a, ll b) {
  ll res = 0;
  a %= mod;

  while (b) {
    if (b & 1)
      res = (res + a) % mod;

    a = (2 * a) % mod;
    b >>= 1;
  }

  return res;
}

ll max(ll a, ll b) {
  if (a > b)
    return a;

  return b;
}
int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  cout.precision(10);
  cout << fixed;

  int r, c, k;
  cin >> r;
  cin >> c;
  cin >> k;
  int grid[3010][3010] = {0};
  ll dp[3010][4][3010] = {0LL};
  int x, y;
  for0(i, k) {
    cin >> x;
    cin >> y;
    cin >> grid[x][y];
  }

  for (int i = 1; i <= r; i++) {
    for (int j = 1; j <= c; j++) {
      dp[i][1][j] =
          max(max(dp[i - 1][1][j], max(dp[i - 1][2][j], dp[i - 1][3][j])) +
                  grid[i][j],
              dp[i][1][j - 1]);
      dp[i][2][j] = max(dp[i][1][j - 1] + grid[i][j], dp[i][2][j - 1]);
      dp[i][3][j] = max(dp[i][2][j - 1] + grid[i][j], dp[i][3][j - 1]);
    }
  }
  cout << max(max(dp[r][1][c], dp[r][2][c]), dp[r][3][c]);

  return 0;
}