Problem p02684 (C++) — buggy submission, verdict: Time Limit Exceeded

#include <algorithm>
#include <bitset>
#include <cassert>
#include <cctype>
#include <cmath>
#include <complex>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <ctime>
#include <fstream>
#include <iomanip>
#include <iostream>
#include <iterator>
#include <list>
#include <map>
#include <numeric>
#include <queue>
#include <set>
#include <sstream>
#include <stack>
#include <string>
#include <utility>
#include <vector>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const double EPS = 1e-9;
const double INT_MAX = 2147483647;
#define rep(i, n) REP(i, 0, n)
#define REP(i, x, n) for (int i = x; i < (int)(n); i++)
#define rrep(i, n) RREP(i, 0, n)
#define RREP(i, x, n) for (int i = (int)(n)-1 - (int)(x); i >= 0; i--)

void printv(vector<int> v) {
  for (auto it = v.begin(); it != v.end(); it++) {
    cout << *it << ",";
  }
  cout << endl;
}

ull N, K;
vector<int> A(10e6);

int main(void) {
  // Your code here!
  cin >> N >> K;
  REP(i, 1, N + 1) { cin >> A[i]; }
  vector<int> l;
  // めぐる街の軌跡
  l.emplace_back(1);
  // ループしているところの先端と終端
  ull idx1, idx2;
  rep(i, N) {
    l.emplace_back(A[l[i]]);
    // 今移動した街が過去にいた街に含まれているか確認する
    //  rep(j,l.size()-1){
    //      if (l[j] == l.back()) {
    //          idx1 = j;
    //          idx2 = l.size() - 1;
    //          //printv(l);
    //          goto A;
    //      }
    //  }
  }
  // printv(l);
  rep(i, N) {
    if (l.back() == l[i]) {
      idx1 = i;
      idx2 = l.size() - 1;
    }
  }
  // A:
  if (K <= idx1)
    cout << l[K] << endl;
  else
    cout << l[idx1 + (K - idx1) % (idx2 - idx1)] << endl;
  // cout << idx1<<" "<<idx2;
}


Error: TLE

Fixed submission:

#include <algorithm>
#include <bitset>
#include <cassert>
#include <cctype>
#include <cmath>
#include <complex>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <ctime>
#include <fstream>
#include <iomanip>
#include <iostream>
#include <iterator>
#include <list>
#include <map>
#include <numeric>
#include <queue>
#include <set>
#include <sstream>
#include <stack>
#include <string>
#include <utility>
#include <vector>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const double EPS = 1e-9;
const double INT_MAX = 2147483647;
#define rep(i, n) REP(i, 0, n)
#define REP(i, x, n) for (int i = x; i < (int)(n); i++)
#define rrep(i, n) RREP(i, 0, n)
#define RREP(i, x, n) for (int i = (int)(n)-1 - (int)(x); i >= 0; i--)

void printv(vector<int> v) {
  for (auto it = v.begin(); it != v.end(); it++) {
    cout << *it << ",";
  }
  cout << endl;
}

ull N, K;
vector<int> A(10e6);

int main(void) {
  // Your code here!
  cin >> N >> K;
  REP(i, 1, N + 1) { cin >> A[i]; }
  vector<int> l;
  // めぐる街の軌跡
  l.emplace_back(1);
  // ループしているところの先端と終端
  ull idx1, idx2;
  rep(i, N) {
    l.emplace_back(A[l[i]]);
    // 今移動した街が過去にいた街に含まれているか確認する
    rep(j, l.size() - 1) {
      if (l[j] == l.back()) {
        idx1 = j;
        idx2 = l.size() - 1;
        // printv(l);
        goto A;
      }
    }
  }
A:
  if (K <= idx1)
    cout << l[K] << endl;
  else
    cout << l[idx1 + (K - idx1) % (idx2 - idx1)] << endl;
  // cout << idx1<<" "<<idx2;
}