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

#include <algorithm>
#include <iostream>
#include <map>
#include <string>
#include <tuple>
#include <vector>
using namespace std;

int main() {

  int N, M;
  long K;
  cin >> N >> M >> K;

  vector<int> A(N, 0);
  vector<int> B(M, 0);
  for (int i = 0; i < N; i++)
    cin >> A[i];
  for (int i = 0; i < M; i++)
    cin >> B[i];

  // 累積和データを保存しておく
  vector<long> sumA(N + 1, 0);
  sumA[0] = 0;
  sumA[1] = sumA[0] + A[0];
  for (int i = 2; i <= N; i++) {
    sumA[i] = sumA[i - 1] + A[i - 1]; // i冊目まで読んだときの合計時間
    // Kが10^9以下なのでオーバーフロー考慮しなくて良い
    if (sumA[i] > K) { // 上限超えとなるので i冊目は存在しないこととする
      N = i - 1;
      break;
    }
  }
  vector<long> sumB(M + 1, 0);
  sumB[0] = 0;
  sumB[1] = sumB[0] + B[0];
  for (int i = 2; i <= M; i++) {
    sumB[i] = sumB[i - 1] + B[i - 1]; // i冊目まで読んだときの合計時間
    // Kが10^9以下なのでオーバーフロー考慮しなくて良い
    if (sumB[i] > K) { // 上限超えとなるので i冊目は存在しないこととする
      M = i - 1;
      break;
    }
  }
  // sumA, sumB の要素は 10^9 以下であるから足し合わせてもオーバーフローしない

  // 読める数最大値
  int maxv = 0;
  pair<int, int> hoge = {0, 0};

  for (int i = 0; i <= N; i++) {
    // Aをi冊読んだらK以上となる
    if (sumA[i] > K)
      break;
    long dst = K - sumA[i];

    if (sumA[i] + sumB[M] <= K) {
      if (maxv < i + M) {
        maxv = i + M;
        hoge = {i, M};
      }
      continue;
    }

    // にぶたん

    int L = 0, R = M;
    if (L >= R)
      continue;

    while (R - L != 1) {
      int mid = (L + R) / 2;
      long tmp = sumB[mid];
      if (tmp < dst) {
        L = mid;
      } else if (tmp == dst) {
        L = mid;
      } else { // tmp > dst
        R = mid;
      }
    }

    if (maxv < i + L) {
      maxv = i + L;
      hoge = {i, L};
    }
  }

  // 検算

  // cout << hoge.first << ' ' << hoge.second << endl;
  cout << maxv << endl;

  return 0;
}

Error: 0

Fixed submission:

#include <algorithm>
#include <iostream>
#include <map>
#include <string>
#include <tuple>
#include <vector>
using namespace std;

// 読めた最大値
int search(int N, int M, int idxa, int idxb, vector<int> A, vector<int> B,
           long nokori) {

  if (idxa >= N && idxb >= M) {
    return 0;
  }

  if (idxa < N && idxb < M) {
    if (A[idxa] <= nokori && B[idxb] <= nokori) {
      int a = search(N, M, idxa + 1, idxb, A, B, nokori - A[idxa]);
      int b = search(N, M, idxa, idxb + 1, A, B, nokori - B[idxb]);
      return max(a, b) + 1;
    } else if (A[idxa] <= nokori) {
      return search(N, M, idxa + 1, idxb, A, B, nokori - A[idxa]) + 1;
    } else if (B[idxb] <= nokori) {
      return search(N, M, idxa, idxb + 1, A, B, nokori - B[idxb]) + 1;
    } else {
      return 0;
    }
  } else if (idxa < N) {
    if (A[idxa] <= nokori) {
      return search(N, M, idxa + 1, idxb, A, B, nokori - A[idxa]) + 1;
    } else {
      return 0;
    }
  } else {
    if (B[idxb] <= nokori) {
      return search(N, M, idxa, idxb + 1, A, B, nokori - B[idxb]) + 1;
    } else {
      return 0;
    }
  }
}

int main() {

  int N, M;
  long K;
  cin >> N >> M >> K;

  vector<int> A(N, 0);
  vector<int> B(M, 0);
  for (int i = 0; i < N; i++)
    cin >> A[i];
  for (int i = 0; i < M; i++)
    cin >> B[i];

  if (K < min(A[0], B[0])) {
    cout << 0 << endl;
    return 0;
  }

  cout << search(N, M, 0, 0, A, B, K) << endl;

  /*
  long totaltime=0;
  int read_count=0;
  int idx_a=0, idx_b=0;
  while(totaltime<=K){
      if(idx_a<N && idx_b<M){
          if(A[idx_a]<B[idx_b]){
              totaltime += A[idx_a];
              //cout << A[idx_a] << ' ';
              idx_a++;
          }else if(A[idx_a]==B[idx_b]){

          }else{
              totaltime += B[idx_b];
              //cout << B[idx_b] << ' ';
              idx_b++;
          }
          read_count++;
      }else if(idx_a<N){
          totaltime += A[idx_a];
          //cout << A[idx_a] << ' ';

          idx_a++;
          read_count++;
      }else if(idx_b<M){
          totaltime += B[idx_b];
          //cout << B[idx_b] << ' ';
          idx_b++;
          read_count++;
      }else{
          read_count++;
          break;
          //cout << 'a' << endl;
      }
  }
  */

  // cout << read_count-1 << endl;

  // jjddja

  return 0;
}