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

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

int main() {

  int N, K;
  cin >> N >> K;

  vector<int> P(N);
  vector<int> C(N);

  for (int i = 0; i < N; i++) {
    cin >> P[i];
  }

  for (int i = 0; i < N; i++) {
    cin >> C[i];
  }

  vector<long long> sum(N);
  long long ans = -1000000000;
  int tmp = 0;

  for (int j = 0; j < N; j++) {
    tmp = j;
    for (int i = 0; i < min(K, N); i++) {
      tmp = P[tmp] - 1;
      if (i == 0) {
        sum[i] = C[tmp];
      } else {
        sum[i] = sum[i - 1] + C[tmp];
      }
      if (i == K - 1) {
        if (*max_element(sum.begin(), sum.begin() + i + 1) > ans) {
          ans = *max_element(sum.begin(), sum.begin() + i + 1);
        }
        break;
      }
      if (tmp == j) {
        if (sum[i] <= 0) {
          if (*max_element(sum.begin(), sum.begin() + i + 1) > ans) {
            ans = *max_element(sum.begin(), sum.begin() + i + 1);
          }
        } else {
          if (K % (i + 1) == 0) {
            if ((K / (i + 1) - 1) * sum[i] +
                    *max_element(sum.begin(), sum.begin() + i + 1) >
                ans) {
              ans = (K / (i + 1) - 1) * sum[i] +
                    *max_element(sum.begin(), sum.begin() + i + 1);
            }
          } else {
            long long tmp1 =
                K / (i + 1) * sum[i] +
                *max_element(sum.begin(), sum.begin() + K % (i + 1));
            long long tmp2 = (K / (i + 1) - 1) * sum[i] +
                             *max_element(sum.begin(), sum.begin() + i + 1);
            if (max(tmp1, tmp2) > ans) {
              ans = max(tmp1, tmp2);
            }
          }
        }
        break;
      }
    }
  }
  cout << ans << endl;
}

Error: 0

Fixed submission:

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

int main() {

  int N, K;
  cin >> N >> K;

  vector<int> P(N + 1);
  vector<int> C(N + 1);

  for (int i = 1; i <= N; i++) {
    cin >> P[i];
  }

  for (int i = 1; i <= N; i++) {
    cin >> C[i];
  }

  vector<long long> sum(N + 1);
  long long ans = -10e9;
  int tmp = 0;
  int loop_length = 1;

  for (int j = 1; j <= N; j++) {
    tmp = j;
    loop_length = 0;
    for (int i = 1; i <= min(K, N); i++) {
      tmp = P[tmp];
      if (i >= 2) {
        sum[i] = sum[i - 1] + C[tmp];
      } else {
        sum[i] = C[tmp];
      }
      loop_length++;
      if (tmp == j) {
        if (sum[i] <= 0) {
          if (sum[distance(sum.begin(), max_element(sum.begin() + 1,
                                                    sum.begin() + i))] > ans) {
            ans = sum[distance(sum.begin(),
                               max_element(sum.begin() + 1, sum.begin() + i))];
          }
        } else {
          if (K % loop_length >=
              distance(sum.begin(),
                       max_element(sum.begin() + 1, sum.begin() + i))) {
            if (K / loop_length * sum[i] +
                    sum[distance(sum.begin(), max_element(sum.begin() + 1,
                                                          sum.begin() + i))] >
                ans) {
              ans = K / loop_length * sum[i] +
                    sum[distance(sum.begin(), max_element(sum.begin() + 1,
                                                          sum.begin() + i))];
            }
          } else {
            if (K % loop_length == 0) {
              if ((K / loop_length - 1) * sum[i] +
                      sum[distance(sum.begin(), max_element(sum.begin() + 1,
                                                            sum.begin() + i))] >
                  ans) {
                ans = (K / loop_length - 1) * sum[i] +
                      sum[distance(sum.begin(), max_element(sum.begin() + 1,
                                                            sum.begin() + i))];
              }
            }
            long long tmp1 =
                K / loop_length * sum[i] +
                sum[distance(sum.begin(),
                             max_element(sum.begin() + 1,
                                         sum.begin() + K % loop_length))];
            long long tmp2 =
                (K / loop_length - 1) * sum[i] +
                sum[distance(sum.begin(),
                             max_element(sum.begin() + 1, sum.begin() + i))];
            if (max(tmp1, tmp2) > ans) {
              ans = max(tmp1, tmp2);
            }
          }
        }
        break;
      }
      if (i == K) {
        if (sum[distance(sum.begin(), max_element(sum.begin() + 1,
                                                  sum.begin() + i))] > ans) {
          ans = sum[distance(sum.begin(),
                             max_element(sum.begin() + 1, sum.begin() + i))];
        }
      }
    }
  }
  cout << ans << endl;
}