Problem p02664 (C++)

Buggy submission (status: Runtime Error):
#include <bits/stdc++.h>
#define LL long long
#define pb push_back
#define SZ(x) ((int)x.size() - 1)
#define ms(a, b) memset(a, b, sizeof a)
#define F(i, a, b) for (int i = (a); i <= (b); ++i)
#define DF(i, a, b) for (int i = (a); i >= (b); --i)
using namespace std;
inline int read() {
  char ch = getchar();
  int w = 1, c = 0;
  for (; !isdigit(ch); ch = getchar())
    if (ch == '-')
      w = -1;
  for (; isdigit(ch); ch = getchar())
    c = (c << 1) + (c << 3) + (ch ^ 48);
  return w * c;
}
const int M = 1e5 + 10;
char ch[M];
int dp[M][2], fr[M][2];
void dg(int x, int o) {
  if (!x)
    return;
  dg(x - 1, fr[x][o]);
  cout << (o ? 'P' : 'D');
}
int n;
int main() {
  scanf("%s", ch + 1);
  n = strlen(ch + 1);
  dp[0][0] = 0;
  dp[0][1] = -1e9;
  F(i, 1, n) {
    F(j, 0, 1) dp[i][j] = -1e9;
    if (ch[i] == 'D') {
      if (dp[i - 1][1] + 2 > dp[i - 1][0] + 1)
        fr[i][0] = 1;
      else
        fr[i][0] = 0;
      dp[i][0] = max(dp[i - 1][1] + 2, dp[i - 1][0] + 1);
    }
    if (ch[i] == 'P') {
      if (dp[i - 1][1] > dp[i - 1][0])
        fr[i][1] = 1;
      else
        fr[i][1] = 0;
      dp[i][1] = max(dp[i - 1][1], dp[i - 1][0]);
    }
    if (ch[i] == '?') {
      if (dp[i - 1][1] + 2 > dp[i - 1][0] + 1)
        fr[i][0] = 1;
      else
        fr[i][0] = 0;
      dp[i][0] = max(dp[i - 1][1] + 2, dp[i - 1][0] + 1);
      if (dp[i - 1][1] > dp[i - 1][0])
        fr[i][1] = 1;
      else
        fr[i][1] = 0;
      dp[i][1] = max(dp[i - 1][1], dp[i - 1][0]);
    }
  }
  if (dp[n][0] > dp[n][1])
    dg(n, 0);
  else
    dg(n, 1);
  return 0;
}


Fixed submission:
#include <bits/stdc++.h>
#define LL long long
#define pb push_back
#define SZ(x) ((int)x.size() - 1)
#define ms(a, b) memset(a, b, sizeof a)
#define F(i, a, b) for (int i = (a); i <= (b); ++i)
#define DF(i, a, b) for (int i = (a); i >= (b); --i)
using namespace std;
inline int read() {
  char ch = getchar();
  int w = 1, c = 0;
  for (; !isdigit(ch); ch = getchar())
    if (ch == '-')
      w = -1;
  for (; isdigit(ch); ch = getchar())
    c = (c << 1) + (c << 3) + (ch ^ 48);
  return w * c;
}
const int M = 2e5 + 10;
char ch[M];
int dp[M][2], fr[M][2];
void dg(int x, int o) {
  if (!x)
    return;
  dg(x - 1, fr[x][o]);
  cout << (o ? 'P' : 'D');
}
int n;
int main() {
  scanf("%s", ch + 1);
  n = strlen(ch + 1);
  dp[0][0] = 0;
  dp[0][1] = -1e9;
  F(i, 1, n) {
    F(j, 0, 1) dp[i][j] = -1e9;
    if (ch[i] == 'D') {
      if (dp[i - 1][1] + 2 > dp[i - 1][0] + 1)
        fr[i][0] = 1;
      else
        fr[i][0] = 0;
      dp[i][0] = max(dp[i - 1][1] + 2, dp[i - 1][0] + 1);
    }
    if (ch[i] == 'P') {
      if (dp[i - 1][1] > dp[i - 1][0])
        fr[i][1] = 1;
      else
        fr[i][1] = 0;
      dp[i][1] = max(dp[i - 1][1], dp[i - 1][0]);
    }
    if (ch[i] == '?') {
      if (dp[i - 1][1] + 2 > dp[i - 1][0] + 1)
        fr[i][0] = 1;
      else
        fr[i][0] = 0;
      dp[i][0] = max(dp[i - 1][1] + 2, dp[i - 1][0] + 1);
      if (dp[i - 1][1] > dp[i - 1][0])
        fr[i][1] = 1;
      else
        fr[i][1] = 0;
      dp[i][1] = max(dp[i - 1][1], dp[i - 1][0]);
    }
  }
  if (dp[n][0] > dp[n][1])
    dg(n, 0);
  else
    dg(n, 1);
  return 0;
}