Problem p03054 (C++)

Buggy submission (status: Runtime Error):
#include <bits/stdc++.h>
using namespace std;

int main() {
  int H, W, N, Sx, Sy;
  cin >> H >> W >> N >> Sx >> Sy;
  string S, T;
  cin >> S >> T;

  bool flag = true; // true ならTの勝ち。つまりYes

  int down[20200]; // 累積和にあたるもの
  int up[20200];   // 初手で出れる場合があるんだよな
  int right[20200];
  int left[20200];
  for (int i = 0; i < N; i++) {
    down[i] = 0;
    up[i] = 0;
    right[i] = 0;
    left[i] = 0;
  }
  // 向きに注意

  // 下へ出れるか
  // SからはDをTからはUを
  if (S.at(0) == 'D') {
    down[0] = 1;
  }
  for (int i = 0; i < N - 1; i++) {
    down[i + 1] = down[i];
    if (T.at(i) == 'U' && (Sx + down[i] > 1))
      down[i + 1]--;
    if (S.at(i + 1) == 'D')
      down[i + 1]++;
  }
  //
  for (int i = 0; i < N; i++) {
    if (down[i] >= H + 1 - Sx) {
      flag = false;
    }
  }

  // 上へ出れるか
  if (S.at(0) == 'U') {
    up[0] = 1;
  }
  for (int i = 0; i < N - 1; i++) {
    up[i + 1] = up[i];
    if (T.at(i) == 'D' && (Sx - up[i] < H))
      up[i + 1]--;
    if (S.at(i + 1) == 'U')
      up[i + 1]++;
  }
  //
  for (int i = 0; i < N; i++) {
    if (up[i] >= Sx) {
      flag = false;
    }
  }

  // 右へ出れるか
  if (S.at(0) == 'R') {
    right[0] = 1;
  }
  for (int i = 0; i < N - 1; i++) {
    right[i + 1] = right[i];
    if (T.at(i) == 'L' && (Sy + right[i] > 1))
      right[i + 1]--;
    if (S.at(i + 1) == 'R')
      right[i + 1]++;
  }
  //
  for (int i = 0; i < N; i++) {
    if (right[i] >= W + 1 - Sy) {
      flag = false;
    }
  }

  // 左へ出れるか
  if (S.at(0) == 'L') {
    left[0] = 1;
  }
  for (int i = 0; i < N - 1; i++) {
    left[i + 1] = left[i];
    if (T.at(i) == 'R' && (Sy - left[i] < W))
      left[i + 1]--;
    if (S.at(i + 1) == 'L')
      left[i + 1]++;
  }

  //
  for (int i = 0; i < N; i++) {
    if (left[i] >= Sy) {
      flag = false;
    }
  }

  if (flag)
    cout << "YES" << endl;
  else
    cout << "NO" << endl;
}

Fixed submission:
#include <bits/stdc++.h>
using namespace std;

int main() {
  int H, W, N, Sx, Sy;
  cin >> H >> W >> N >> Sx >> Sy;
  string S, T;
  cin >> S >> T;

  bool flag = true; // true ならTの勝ち。つまりYes

  int down[202000]; // 累積和にあたるもの
  int up[202000];   // 初手で出れる場合があるんだよな
  int right[202000];
  int left[202000];
  for (int i = 0; i < N; i++) {
    down[i] = 0;
    up[i] = 0;
    right[i] = 0;
    left[i] = 0;
  }
  // 向きに注意

  // 下へ出れるか
  // SからはDをTからはUを
  if (S.at(0) == 'D') {
    down[0] = 1;
  }
  for (int i = 0; i < N - 1; i++) {
    down[i + 1] = down[i];
    if (T.at(i) == 'U' && (Sx + down[i] > 1))
      down[i + 1]--;
    if (S.at(i + 1) == 'D')
      down[i + 1]++;
  }
  //
  for (int i = 0; i < N; i++) {
    if (down[i] >= H + 1 - Sx) {
      flag = false;
    }
  }

  // 上へ出れるか
  if (S.at(0) == 'U') {
    up[0] = 1;
  }
  for (int i = 0; i < N - 1; i++) {
    up[i + 1] = up[i];
    if (T.at(i) == 'D' && (Sx - up[i] < H))
      up[i + 1]--;
    if (S.at(i + 1) == 'U')
      up[i + 1]++;
  }
  //
  for (int i = 0; i < N; i++) {
    if (up[i] >= Sx) {
      flag = false;
    }
  }

  // 右へ出れるか
  if (S.at(0) == 'R') {
    right[0] = 1;
  }
  for (int i = 0; i < N - 1; i++) {
    right[i + 1] = right[i];
    if (T.at(i) == 'L' && (Sy + right[i] > 1))
      right[i + 1]--;
    if (S.at(i + 1) == 'R')
      right[i + 1]++;
  }
  //
  for (int i = 0; i < N; i++) {
    if (right[i] >= W + 1 - Sy) {
      flag = false;
    }
  }

  // 左へ出れるか
  if (S.at(0) == 'L') {
    left[0] = 1;
  }
  for (int i = 0; i < N - 1; i++) {
    left[i + 1] = left[i];
    if (T.at(i) == 'R' && (Sy - left[i] < W))
      left[i + 1]--;
    if (S.at(i + 1) == 'L')
      left[i + 1]++;
  }

  //
  for (int i = 0; i < N; i++) {
    if (left[i] >= Sy) {
      flag = false;
    }
  }

  if (flag)
    cout << "YES" << endl;
  else
    cout << "NO" << endl;
}