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


// Problem : D - Teleporter
// Contest : AtCoder - AtCoder Beginner Contest 167
// URL : https://atcoder.jp/contests/abc167/tasks/abc167_d
// Memory Limit : 1024 MB
// Time Limit : 2000 ms
// Powered by CP Editor (https://github.com/cpeditor/cpeditor)

// #pragma optimize("03")
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>

using namespace std;
using namespace __gnu_pbds;

typedef long long ll;
typedef long double ld;
typedef complex<ld> cd;

typedef pair<int, int> pi;
typedef pair<ll, ll> pl;
typedef pair<ld, ld> pd;

typedef vector<int> vi;
typedef vector<ld> vd;
typedef vector<ll> vl;
typedef vector<pi> vpi;
typedef vector<pl> vpl;
typedef vector<cd> vcd;

template <class T>
using Tree =
    tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>;

#define FOR(i, a, b) for (int i = a; i < (b); i++)
#define F0R(i, a) for (int i = 0; i < (a); i++)
#define FORd(i, a, b) for (int i = (b)-1; i >= a; i--)
#define F0Rd(i, a) for (int i = (a)-1; i >= 0; i--)

#define sz(x) (int)(x).size()
#define mp make_pair
#define pb push_back
#define f first
#define s second
#define lb lower_bound
#define ub upper_bound
#define all(x) x.begin(), x.end()
#define ins insert

mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());

const int MOD = 1000000007;
const ll INF = 1e18;
const int MX = 100001; // check the limits, dummy
int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);

  // int T; cin >> T;
  // while(T--)
  //{
  //
  //  }
  int N;
  ll K;
  cin >> N >> K;
  vi v;
  vi vis;
  v.reserve(N);
  vis.reserve(N);
  F0R(x, N) {
    int nb;
    cin >> nb;
    nb--;
    v.pb(nb);
    vis.pb(0);
  }
  int S = 0, len = 0;
  while (!vis[S]) {
    vis[S] = 1;
    S = v[S];
    len++;
    if (len == K) {
      cout << S + 1 << endl;
      return 0;
    }
  }
  int sze = 1, cpy = S;
  vi ans;
  ans.pb(S);
  S = v[S];
  ans.pb(S);
  while (S != cpy) {
    sze++;
    S = v[S];
    ans.pb(S);
  }
  // ll ans=;
  int val = (int)((K - len) % sze);

  // S=cpy;
  // while(val!=0)
  // {
  // S=v[S];
  // val--;
  // }
  cout << ans[val] + 1 << endl;
  return 0;
}


Error: 0

Fixed submission:


// Problem : D - Teleporter
// Contest : AtCoder - AtCoder Beginner Contest 167
// URL : https://atcoder.jp/contests/abc167/tasks/abc167_d
// Memory Limit : 1024 MB
// Time Limit : 2000 ms
// Powered by CP Editor (https://github.com/cpeditor/cpeditor)

// #pragma optimize("03")
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>

using namespace std;
using namespace __gnu_pbds;

typedef long long ll;
typedef long double ld;
typedef complex<ld> cd;

typedef pair<int, int> pi;
typedef pair<ll, ll> pl;
typedef pair<ld, ld> pd;

typedef vector<int> vi;
typedef vector<ld> vd;
typedef vector<ll> vl;
typedef vector<pi> vpi;
typedef vector<pl> vpl;
typedef vector<cd> vcd;

template <class T>
using Tree =
    tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>;

#define FOR(i, a, b) for (int i = a; i < (b); i++)
#define F0R(i, a) for (int i = 0; i < (a); i++)
#define FORd(i, a, b) for (int i = (b)-1; i >= a; i--)
#define F0Rd(i, a) for (int i = (a)-1; i >= 0; i--)

#define sz(x) (int)(x).size()
#define mp make_pair
#define pb push_back
#define f first
#define s second
#define lb lower_bound
#define ub upper_bound
#define all(x) x.begin(), x.end()
#define ins insert

mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());

const int MOD = 1000000007;
const ll INF = 1e18;
const int MX = 100001; // check the limits, dummy
int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);

  // int T; cin >> T;
  // while(T--)
  //{
  //
  //  }
  int N;
  ll K;
  cin >> N >> K;
  vi v;
  vi vis;
  v.reserve(N);
  vis.reserve(N);
  F0R(x, N) {
    int nb;
    cin >> nb;
    nb--;
    v.pb(nb);
    vis.pb(0);
  }
  int S = 0, len = 0;
  while (!vis[S]) {
    vis[S] = 1;
    S = v[S];
    len++;
  }
  int sze = 1, cpy = S;
  vi ans;
  ans.pb(S);
  S = v[S];
  ans.pb(S);
  while (S != cpy) {
    sze++;
    S = v[S];
    ans.pb(S);
  }
  // ll ans=;
  int val = (int)((K - len) % sze);
  // S=cpy;
  // while(val!=0)
  // {
  // S=v[S];
  // val--;
  // }
  cout << ans[val] + 1 << endl;
  return 0;
}