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

// include
// ------------------------------------------------
#include <algorithm>
#include <bits/stdc++.h>
#include <math.h>
#include <vector>

using namespace std;

// func
// ------------------------------------------------
int CalcSumOfDigit(int n);       // 各桁の和を計算する。
long long getDigit(long long n); // 数字の桁数を取得する。
string upper(string str);        // 英字を大文字に変換する。
string lower(string str);        // 英字を小文字に変換する。

// define
// ------------------------------------------------
#define all(a) (a).begin(), (a).end()
#define rall(a) (a).rbegin(), (a).rend()
#define sz(a) int((a).size())
#define rep(i, n) for (int(i) = 0; (i) < (n); (i)++)
#define repe(i, n) for (int(i) = 0; (i) <= (n); (i)++)
#define vsort(v) sort((v).begin(), (v).end())
#define rvsort(v) sort(rall((v)))
#define vi vector<int>
#define GCD(a, b) __gcd((a), (b))
#define LCM(a, b) ((a) / GCD((a), (b)) * (b))
#define kiriage(a, b) ((a) + (b)-1) / (b)

const int INF = 1e9;

typedef long long ll;
typedef unsigned long long ull;
typedef vector<ll> vll;

// code
// ------------------------------------------------
int main() {
  ull n, k;
  cin >> n >> k;
  vector<ull> a(n);

  rep(i, n) {
    cin >> a[i];
    a[i]--;
  }

  map<ull, ull> m;

  ull pos = 0;
  ull cnt = 0;
  ull cir = 0;
  ull st = 0;
  m[pos] = cnt;

  bool flg = false;
  ull nocir = 0;

  while (1) {
    ull next = a[pos];
    pos = next;

    cnt++;
    if (m.find(next) != m.end()) {
      cir = cnt - m[next];
      st = m[next];
      pos = next;
      flg = true;
      break;
    }

    if (cnt == k) {
      nocir = pos;
      break;
    }

    m[next] = cnt;
  }

  if (flg) {
    ull buf = (k - st) % cir;

    rep(i, buf) { pos = a[pos]; }
    cout << pos + 1 << endl;
  } else {
    cout << nocir + 1 << endl;
  }

  return 0;
}
// funcの実体
// ------------------------------------------------
ll getDigit(ll n) {
  int i = 1;
  while (1) {
    n = n / 10;
    if (n == 0)
      break;
    i++;
  }
  return i;
}
ll CalcSumOfDigit(ll n) {
  ll s = 0;
  while (n) {
    s += n % 10;
    n = n / 10;
  }
  return s;
}

string upper(string str) {
  for (auto itr = str.begin(); itr != str.end(); itr++) {
    if (97 <= *itr && *itr <= 122) {
      *itr = *itr - 32;
    }
  }
  return str;
}

string lower(string str) {
  for (auto itr = str.begin(); itr != str.end(); itr++) {
    if (65 <= *itr && *itr <= 90) {
      *itr = *itr + 32;
    }
  }
  return str;
}


Error: 0

Fixed submission:

// include
// ------------------------------------------------
#include <algorithm>
#include <bits/stdc++.h>
#include <math.h>
#include <vector>

using namespace std;

// func
// ------------------------------------------------
int CalcSumOfDigit(int n);       // 各桁の和を計算する。
long long getDigit(long long n); // 数字の桁数を取得する。
string upper(string str);        // 英字を大文字に変換する。
string lower(string str);        // 英字を小文字に変換する。

// define
// ------------------------------------------------
#define all(a) (a).begin(), (a).end()
#define rall(a) (a).rbegin(), (a).rend()
#define sz(a) int((a).size())
#define rep(i, n) for (int(i) = 0; (i) < (n); (i)++)
#define repe(i, n) for (int(i) = 0; (i) <= (n); (i)++)
#define vsort(v) sort((v).begin(), (v).end())
#define rvsort(v) sort(rall((v)))
#define vi vector<int>
#define GCD(a, b) __gcd((a), (b))
#define LCM(a, b) ((a) / GCD((a), (b)) * (b))
#define kiriage(a, b) ((a) + (b)-1) / (b)

const int INF = 1e9;

typedef long long ll;
typedef unsigned long long ull;
typedef vector<ll> vll;

// code
// ------------------------------------------------
int main() {
  ull n, k;
  cin >> n >> k;
  vector<ull> a(n);

  rep(i, n) {
    cin >> a[i];
    a[i]--;
  }

  map<ull, ull> m;

  ull pos = 0;
  ull cnt = 0;
  ull cir = 0;
  ull st = 0;
  m[pos] = cnt;

  bool flg = false;
  ull nocir = 0;

  while (1) {
    ull next = a[pos];
    pos = next;

    cnt++;
    if (m.find(next) != m.end()) {
      cir = cnt - m[next];
      st = m[next];
      pos = next;
      flg = true;
      break;
    }

    if (cnt == k) {
      nocir = pos;
      break;
    }

    m[next] = cnt;
  }

  ull buf = (k - st) % cir;

  rep(i, buf) { pos = a[pos]; }

  if (flg)
    cout << pos + 1 << endl;
  else
    cout << nocir + 1 << endl;

  return 0;
}
// funcの実体
// ------------------------------------------------
ll getDigit(ll n) {
  int i = 1;
  while (1) {
    n = n / 10;
    if (n == 0)
      break;
    i++;
  }
  return i;
}
ll CalcSumOfDigit(ll n) {
  ll s = 0;
  while (n) {
    s += n % 10;
    n = n / 10;
  }
  return s;
}

string upper(string str) {
  for (auto itr = str.begin(); itr != str.end(); itr++) {
    if (97 <= *itr && *itr <= 122) {
      *itr = *itr - 32;
    }
  }
  return str;
}

string lower(string str) {
  for (auto itr = str.begin(); itr != str.end(); itr++) {
    if (65 <= *itr && *itr <= 90) {
      *itr = *itr + 32;
    }
  }
  return str;
}