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

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

// マクロ
// forループ関係
// 引数は、(ループ内変数,動く範囲)か(ループ内変数,始めの数,終わりの数)、のどちらか
// Dがついてないものはループ変数は1ずつインクリメントされ、Dがついてるものはループ変数は1ずつデクリメントされる
#define REP(i, n) for (lol i = 0; i < lol(n); i++)
#define REPD(i, n) for (lol i = n - 1; i >= 0; i--)
#define FOR(i, a, b) for (lol i = a; i <= lol(b); i++)
#define FORD(i, a, b) for (lol i = a; i >= lol(b); i--)
// xにはvectorなどのコンテナ
#define ALL(x) x.begin(), x.end() // sortなどの引数を省略したい
#define SIZE(x) lol(x.size())     // sizeをsize_tからllに直しておく
// 定数
#define PI 3.1415926535897932385 // pi
#define INF 1000000000000        // 10^12:極めて大きい値,∞
#define MOD 1000000007           // 10^9+7:合同式の法
#define MAXR 100000 // 10^5:配列の最大のrange(素数列挙などで使用)
// 最大値最小値
template <class T> bool chmax(T &a, const T &b) {
  if (a < b) {
    a = b;
    return 1;
  }
  return 0;
}
template <class T> bool chmin(T &a, const T &b) {
  if (b < a) {
    a = b;
    return 1;
  }
  return 0;
}
int gcd(int a, int b) { return b ? gcd(b, a % b) : a; }

int main() {
  lol result{0};
  lol n;
  cin >> n;
  lol k;
  cin >> k;
  vector<int> a(n + 1);
  vector<int> b(n + 1, 0);
  a[0] = 0;
  FOR(i, 1, n) { cin >> a[i]; }
  int cur = 1;
  int m = 1;
  int c[n + 1], d[n + 1];
  while (true) {
    int tugi = a[cur];
    if (b[tugi] == 0) {
      b[tugi] = 1;
      c[tugi] = m;
      d[m] = tugi;
      m++;
    } else {
      cur = tugi;
      break;
    }
    cur = tugi;
  }
  int ro = m - c[cur];
  if (k < m)
    cout << d[k] << endl;
  else {
    k -= c[cur];
    k %= ro;
    cout << d[c[cur] + k] << endl;
  }

  // cout << result << endl;
  return 0;
}

Error: 0

Fixed submission:

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

// マクロ
// forループ関係
// 引数は、(ループ内変数,動く範囲)か(ループ内変数,始めの数,終わりの数)、のどちらか
// Dがついてないものはループ変数は1ずつインクリメントされ、Dがついてるものはループ変数は1ずつデクリメントされる
#define REP(i, n) for (lol i = 0; i < lol(n); i++)
#define REPD(i, n) for (lol i = n - 1; i >= 0; i--)
#define FOR(i, a, b) for (lol i = a; i <= lol(b); i++)
#define FORD(i, a, b) for (lol i = a; i >= lol(b); i--)
// xにはvectorなどのコンテナ
#define ALL(x) x.begin(), x.end() // sortなどの引数を省略したい
#define SIZE(x) lol(x.size())     // sizeをsize_tからllに直しておく
// 定数
#define PI 3.1415926535897932385 // pi
#define INF 1000000000000        // 10^12:極めて大きい値,∞
#define MOD 1000000007           // 10^9+7:合同式の法
#define MAXR 100000 // 10^5:配列の最大のrange(素数列挙などで使用)
// 最大値最小値
template <class T> bool chmax(T &a, const T &b) {
  if (a < b) {
    a = b;
    return 1;
  }
  return 0;
}
template <class T> bool chmin(T &a, const T &b) {
  if (b < a) {
    a = b;
    return 1;
  }
  return 0;
}
int gcd(int a, int b) { return b ? gcd(b, a % b) : a; }

class Node {
public:
  int next;
  int flag;
};

int main() {
  lol result{0};
  lol n;
  cin >> n;
  lol k;
  cin >> k;
  int cur{1};

  vector<Node> a(n);
  FOR(i, 1, n) {
    cin >> a[i].next;
    a[i].flag = 0;
  }
  lol m{1};
  lol b[200010];
  lol c[200010];
  lol ro;
  lol save;
  bool flaggg = true;

  while (flaggg) {
    int tugi = a[cur].next;
    // cout << cur << endl;
    // cout << "tugi = " << tugi << endl;
    if (a[tugi].flag == 0) {
      a[tugi].flag = 1;
      m++;
      b[tugi] = m;
      c[m] = tugi;
    } else {
      ro = m - b[tugi];
      save = b[tugi];
      flaggg = false;
      break;
    }
    cur = tugi;
  }
  // cout << "m = " << m << endl;
  if (k < m)
    result = c[k];
  else {
    lol d = k - save;
    lol e = d % ro;
    result = c[save + e];
  }

  cout << result << endl;
  return 0;
}