Problem p02623 (C++)

Buggy submission (status: Runtime Error):
#include <iostream>
#include <vector>
/*
二台の机 A, B があります。机 A には N 冊の本が、机 B には M
冊の本が、それぞれ縦に積まれています。

机 A に現在上から i 番目に積まれている本 (1≤i≤N) は読むのに Ai 分を要し、
机 B に現在上から i 番目に積まれている本 (1≤i≤M) は読むのに Bi 分を要します。

次の行為を考えます。

本が残っている机を選び、その机の最も上に積まれた本を読んで机から取り除く。
合計所要時間が K
分を超えないようにこの行為を繰り返すとき、最大で何冊の本を読むことができるでしょうか。本を読むこと以外に要する時間は無視します。
*/
void N_Greedy(int n = -1) {
  unsigned int N, M, K;
  std::vector<long long> A, B;
  std::cin >> N >> M >> K;
  unsigned int A_Cursor = 0, B_Cursor = 0;
  unsigned long long time = 0;
  unsigned int numReadBook = 0;
  unsigned long long sumMinTime, sumBufTime;
  int pivot;
  unsigned int i;
  if (n == -1)
    n = (int)N;
  A = std::vector<long long>(N);
  B = std::vector<long long>(M);
  for (i = 0; i < N; ++i)
    std::cin >> A[i];
  for (i = 0; i < M; ++i)
    std::cin >> B[i];
  while (n > 0) {
    // sumMinTime=-1;
    pivot = -1;
    for (i = 0; i < (unsigned int)n + 1; ++i) {
      sumBufTime = 0;
      // int cnt=0;
      if (A_Cursor + i > N || B_Cursor + (n - i) > M) {
        continue;
      }
      for (unsigned int j = A_Cursor; j < A_Cursor + i; ++j) {
        sumBufTime += A[j];
        // std::cout<<A[i]<<" ";
        // cnt++;
      }
      // std::cout<<std::endl;
      for (unsigned int j = B_Cursor; j < B_Cursor + (n - i); ++j) {
        sumBufTime += B[j];
        // std::cout<<B[i]<<" ";
        // cnt++;
      }
      // std::cout<<std::endl;
      // std::cout<<n<<":"<<cnt<<std::endl;
      if (pivot == -1 || sumMinTime > sumBufTime) {
        sumMinTime = sumBufTime;
        pivot = i;
        // std::cout<<"check"<<std::endl;
      }
    }
    if (pivot != -1 && (K - time) >= sumMinTime) {
      time += sumMinTime;
      numReadBook += n;
      // std::cout<<sumMinTime<<std::endl;
      A_Cursor += pivot;
      B_Cursor += n - pivot;
    } else {
      --n;
    }
  }
  std::cout << numReadBook;
}

void correct() {
  int N, M;
  unsigned long long K;
  std::vector<unsigned long long> A, B;
  std::vector<unsigned long long> sumA, sumB;
  std::cin >> N >> M >> K;

  A = std::vector<unsigned long long>(N);
  B = std::vector<unsigned long long>(M);
  sumA = std::vector<unsigned long long>(N + 1, 0);
  sumB = std::vector<unsigned long long>(M + 1, 0);
  int numReadBook = -1, bufReadBook;
  int startJ = M;

  for (int i = 0; i < N; ++i) {
    std::cin >> A[i];
    sumA[i + 1] = sumA[i] + A[i];
  }
  for (int i = 0; i < M; ++i) {
    std::cin >> B[i];
    sumB[i + 1] = sumB[i] + B[i];
  }

  for (int i = 0; i < N + 1; ++i) {
    for (int j = startJ; j >= 0; ++j) { // 降順
      if (sumA[i] + sumB[j] <= K) {
        bufReadBook = i + j;
        startJ = j;
        break;
      }
    }
    if (numReadBook == -1 || numReadBook < bufReadBook) {
      numReadBook = bufReadBook;
    }
  }
  if (numReadBook > -1)
    std::cout << numReadBook;
  else
    std::cout << 0;
}
int main() {
  // N_Greedy();
  correct();
  return 0;
}

Fixed submission:
#include <iostream>
#include <vector>
/*
二台の机 A, B があります。机 A には N 冊の本が、机 B には M
冊の本が、それぞれ縦に積まれています。

机 A に現在上から i 番目に積まれている本 (1≤i≤N) は読むのに Ai 分を要し、
机 B に現在上から i 番目に積まれている本 (1≤i≤M) は読むのに Bi 分を要します。

次の行為を考えます。

本が残っている机を選び、その机の最も上に積まれた本を読んで机から取り除く。
合計所要時間が K
分を超えないようにこの行為を繰り返すとき、最大で何冊の本を読むことができるでしょうか。本を読むこと以外に要する時間は無視します。
*/
void N_Greedy(int n = -1) {
  unsigned int N, M, K;
  std::vector<long long> A, B;
  std::cin >> N >> M >> K;
  unsigned int A_Cursor = 0, B_Cursor = 0;
  unsigned long long time = 0;
  unsigned int numReadBook = 0;
  unsigned long long sumMinTime, sumBufTime;
  int pivot;
  unsigned int i;
  if (n == -1)
    n = (int)N;
  A = std::vector<long long>(N);
  B = std::vector<long long>(M);
  for (i = 0; i < N; ++i)
    std::cin >> A[i];
  for (i = 0; i < M; ++i)
    std::cin >> B[i];
  while (n > 0) {
    // sumMinTime=-1;
    pivot = -1;
    for (i = 0; i < (unsigned int)n + 1; ++i) {
      sumBufTime = 0;
      // int cnt=0;
      if (A_Cursor + i > N || B_Cursor + (n - i) > M) {
        continue;
      }
      for (unsigned int j = A_Cursor; j < A_Cursor + i; ++j) {
        sumBufTime += A[j];
        // std::cout<<A[i]<<" ";
        // cnt++;
      }
      // std::cout<<std::endl;
      for (unsigned int j = B_Cursor; j < B_Cursor + (n - i); ++j) {
        sumBufTime += B[j];
        // std::cout<<B[i]<<" ";
        // cnt++;
      }
      // std::cout<<std::endl;
      // std::cout<<n<<":"<<cnt<<std::endl;
      if (pivot == -1 || sumMinTime > sumBufTime) {
        sumMinTime = sumBufTime;
        pivot = i;
        // std::cout<<"check"<<std::endl;
      }
    }
    if (pivot != -1 && (K - time) >= sumMinTime) {
      time += sumMinTime;
      numReadBook += n;
      // std::cout<<sumMinTime<<std::endl;
      A_Cursor += pivot;
      B_Cursor += n - pivot;
    } else {
      --n;
    }
  }
  std::cout << numReadBook;
}

void correct() {
  int N, M;
  unsigned long long K;
  std::vector<unsigned long long> A, B;
  std::vector<unsigned long long> sumA, sumB;
  std::cin >> N >> M >> K;

  A = std::vector<unsigned long long>(N);
  B = std::vector<unsigned long long>(M);
  sumA = std::vector<unsigned long long>(N + 1, 0);
  sumB = std::vector<unsigned long long>(M + 1, 0);
  int numReadBook = -1, bufReadBook;
  int startJ = M;

  for (int i = 0; i < N; ++i) {
    std::cin >> A[i];
    sumA[i + 1] = sumA[i] + A[i];
  }
  for (int i = 0; i < M; ++i) {
    std::cin >> B[i];
    sumB[i + 1] = sumB[i] + B[i];
  }

  for (int i = 0; i < N + 1; ++i) {
    for (int j = startJ; j >= 0; --j) { // 降順
      if (sumA[i] + sumB[j] <= K) {
        bufReadBook = i + j;
        startJ = j;
        break;
      }
    }
    if (numReadBook == -1 || numReadBook < bufReadBook) {
      numReadBook = bufReadBook;
    }
  }
  if (numReadBook > -1)
    std::cout << numReadBook;
  else
    std::cout << 0;
}
int main() {
  // N_Greedy();
  correct();
  return 0;
}