Problem p03054 (C++)

Buggy submission (status: Runtime Error):
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <queue>
using namespace std;

typedef long long LL;

const int N = 2e5 + 100;

char a[N], b[N], c[N];
int h_max[N], h_min[N], v_max[N], v_min[N];
int h_max_suf[N], h_min_suf[N], v_max_suf[N], v_min_suf[N];
int main() {
  int n, m, Q;
  cin >> n >> m >> Q;
  int x, y;
  cin >> x >> y;
  Q *= 2;
  scanf("%s", c + 1);
  scanf("%s", b + 1);
  for (int i = 1; i <= Q; i++) {
    if (i % 2 == 0)
      a[i] = b[(i + 1) / 2];
    else
      a[i] = c[(i + 1) / 2];
  }
  h_max[0] = h_min[0] = y;
  v_max[0] = v_min[0] = x;
  for (int i = 1; i <= Q; i++) {
    h_max[i] = h_max[i - 1], h_min[i] = h_min[i - 1];
    v_max[i] = v_max[i - 1], v_min[i] = v_min[i - 1];
    if (i % 2 == 0) {
      if (a[i] == 'R')
        h_min[i]++;
      if (a[i] == 'L')
        h_max[i]--;
      if (a[i] == 'U')
        v_max[i]--;
      if (a[i] == 'D')
        v_min[i]++;
    }
    if (i % 2 == 1) {
      if (a[i] == 'R')
        h_max[i]++;
      if (a[i] == 'L')
        h_min[i]--;
      if (a[i] == 'D')
        v_max[i]++;
      if (a[i] == 'U')
        v_min[i]--;
    }
  }

  v_max[Q + 1] = h_max[Q + 1] = -0x3f3f3f3f;
  v_min[Q + 1] = h_min[Q + 1] = 0x3f3f3f3f;
  for (int i = Q; i >= 1; i--) {
    h_max[i] = max(h_max[i], h_max[i + 1]);
    h_min[i] = min(h_min[i], h_min[i + 1]);
    v_max[i] = max(v_max[i], v_max[i + 1]);
    v_min[i] = min(v_min[i], v_min[i + 1]);
    h_max_suf[i] = h_max[i] - h_max[i - 1];
    h_min_suf[i] = h_min[i] - h_min[i - 1];
    v_max_suf[i] = v_max[i] - v_max[i - 1];
    v_min_suf[i] = v_min[i] - v_min[i - 1];
  }
  bool flag = true;
  for (int i = 1; i <= Q; i++) {
    h_max[i] = h_max[i - 1], h_min[i] = h_min[i - 1];
    v_max[i] = v_max[i - 1], v_min[i] = v_min[i - 1];
    if (i % 2 == 0) {
      if (a[i] == 'R')
        h_min[i]++;
      if (a[i] == 'L')
        h_max[i]--;
      if (a[i] == 'U')
        v_max[i]--;
      if (a[i] == 'D')
        v_min[i]++;
    }
    if (i % 2 == 1) {
      if (a[i] == 'R')
        h_max[i]++;
      if (a[i] == 'L')
        h_min[i]--;
      if (a[i] == 'D')
        v_max[i]++;
      if (a[i] == 'U')
        v_min[i]--;
    }
    if (i != Q) {
      h_max[i] = max(h_max[i], 1 - h_min_suf[i + 1]);
      h_min[i] = min(h_min[i], m - h_max_suf[i + 1]);
      v_max[i] = max(v_max[i], 1 - v_min_suf[i + 1]);
      v_min[i] = min(v_min[i], n - v_max_suf[i + 1]);
    }
    if (h_max[i] > m || h_min[i] < 1 || v_max[i] > n || v_min[i] < 1)
      flag = false;
  }

  if (flag)
    puts("YES");
  else
    puts("NO");
}


Fixed submission:
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <queue>
using namespace std;

typedef long long LL;

const int N = 4e5 + 100;

char a[N], b[N], c[N];
int h_max[N], h_min[N], v_max[N], v_min[N];
int h_max_suf[N], h_min_suf[N], v_max_suf[N], v_min_suf[N];
int main() {
  int n, m, Q;
  cin >> n >> m >> Q;
  int x, y;
  cin >> x >> y;
  Q *= 2;
  scanf("%s", c + 1);
  scanf("%s", b + 1);
  for (int i = 1; i <= Q; i++) {
    if (i % 2 == 0)
      a[i] = b[(i + 1) / 2];
    else
      a[i] = c[(i + 1) / 2];
  }
  h_max[0] = h_min[0] = y;
  v_max[0] = v_min[0] = x;
  for (int i = 1; i <= Q; i++) {
    h_max[i] = h_max[i - 1], h_min[i] = h_min[i - 1];
    v_max[i] = v_max[i - 1], v_min[i] = v_min[i - 1];
    if (i % 2 == 0) {
      if (a[i] == 'R')
        h_min[i]++;
      if (a[i] == 'L')
        h_max[i]--;
      if (a[i] == 'U')
        v_max[i]--;
      if (a[i] == 'D')
        v_min[i]++;
    }
    if (i % 2 == 1) {
      if (a[i] == 'R')
        h_max[i]++;
      if (a[i] == 'L')
        h_min[i]--;
      if (a[i] == 'D')
        v_max[i]++;
      if (a[i] == 'U')
        v_min[i]--;
    }
  }

  v_max[Q + 1] = h_max[Q + 1] = -0x3f3f3f3f;
  v_min[Q + 1] = h_min[Q + 1] = 0x3f3f3f3f;
  for (int i = Q; i >= 1; i--) {
    h_max[i] = max(h_max[i], h_max[i + 1]);
    h_min[i] = min(h_min[i], h_min[i + 1]);
    v_max[i] = max(v_max[i], v_max[i + 1]);
    v_min[i] = min(v_min[i], v_min[i + 1]);
    h_max_suf[i] = h_max[i] - h_max[i - 1];
    h_min_suf[i] = h_min[i] - h_min[i - 1];
    v_max_suf[i] = v_max[i] - v_max[i - 1];
    v_min_suf[i] = v_min[i] - v_min[i - 1];
  }
  bool flag = true;
  for (int i = 1; i <= Q; i++) {
    h_max[i] = h_max[i - 1], h_min[i] = h_min[i - 1];
    v_max[i] = v_max[i - 1], v_min[i] = v_min[i - 1];
    if (i % 2 == 0) {
      if (a[i] == 'R')
        h_min[i]++;
      if (a[i] == 'L')
        h_max[i]--;
      if (a[i] == 'U')
        v_max[i]--;
      if (a[i] == 'D')
        v_min[i]++;
    }
    if (i % 2 == 1) {
      if (a[i] == 'R')
        h_max[i]++;
      if (a[i] == 'L')
        h_min[i]--;
      if (a[i] == 'D')
        v_max[i]++;
      if (a[i] == 'U')
        v_min[i]--;
    }
    if (i != Q) {
      h_max[i] = max(h_max[i], 1 - h_min_suf[i + 1]);
      h_min[i] = min(h_min[i], m - h_max_suf[i + 1]);
      v_max[i] = max(v_max[i], 1 - v_min_suf[i + 1]);
      v_min[i] = min(v_min[i], n - v_max_suf[i + 1]);
    }
    if (h_max[i] > m || h_min[i] < 1 || v_max[i] > n || v_min[i] < 1)
      flag = false;
  }

  if (flag)
    puts("YES");
  else
    puts("NO");
}