Problem p02964 (C++)

Buggy submission (status: Runtime Error):
#include <bits/stdc++.h>
#define ALL(A) (A).begin(), (A).end()
#define ll long long
#define rep(i, n) for (int i = 0; i < (n); i++)

const ll mod = 1e9 + 7;
const ll INF = -1 * ((1LL << 63) + 1);
const int inf = -1 * ((1 << 31) + 1);

using namespace std;

int main(void) {
  cin.tie(0);
  ios::sync_with_stdio(false);
  cout << fixed << setprecision(20);
  ll N, K;
  cin >> N >> K;
  vector<int> A(N);
  vector<int> spot(N, -1);
  vector<vector<int>> data(2e5 + 1);
  // data[i][j] := iがj番目に出現する時の座標 (0-indexed);

  // spot[i] := i番目の数と同じ数が次に出現する時の座標(0-indexd);

  rep(i, N) {
    cin >> A[i];
    data[A[i]].push_back(i);
  }
  rep(i, N) {
    // i番目の数と同じ数が次に出現する座標を求めていく
    int now = A[i];
    for (auto x : data[now]) {
      if (x > i) {
        spot[i] = x;
        break;
      }
    }
    if (spot[i] == -1) {
      // 右側にi番目の数と同じ数が出現しない場合は左側で1番最初に出現した数にする
      for (auto x : data[now]) {
        spot[i] = x;
        break;
      }
    }
    if (spot[i] == -1) {
      // 左側にも右側にも出現しない場合は1周させる
      spot[i] = i;
    }
  }
  // どれだけの数を進んだら、sが空で開始地点が0になるかを調べる
  ll dis = 0;
  ll X = 0;
  while (1) {
    ll next;
    // 現在地点はXで次にXと同じ数が出現する座標はspot[X]にある
    if (spot[X] > X) {
      // もしも右側にXと同じ数があった場合は
      next = spot[X];
      dis += next - X + 1;
      X = next;
    } else if (spot[X] <= X) {
      // 左側にXと同じ数があった場合は
      next = (spot[X] + N);
      dis += next - X + 1;
      X = next;
    }
    X++;
    X %= N;
    if (X == 0)
      break;
  }
  ll length = ((N * K) % dis) / N;
  vector<int> ans;
  if (length == 0)
    cout << "" << endl;
  else {

    length = length * N;
    for (ll i = 0; i < length; i++) {
      int next = spot[i % N] + (i / N) * N;
      if (next % N <= i % N)
        next += N;
      if (next < length)
        i = next;
      else {
        ans.push_back(A[i % N]);
      }
    }
  }
  for (auto x : ans)
    cout << x << " ";
}

Fixed submission:
#include <bits/stdc++.h>
#define ALL(A) (A).begin(), (A).end()
#define ll long long
#define rep(i, n) for (int i = 0; i < (n); i++)

const ll mod = 1e9 + 7;
const ll INF = -1 * ((1LL << 63) + 1);
const int inf = -1 * ((1 << 31) + 1);

using namespace std;

int main(void) {
  cin.tie(0);
  ios::sync_with_stdio(false);
  cout << fixed << setprecision(20);
  ll N, K;
  cin >> N >> K;
  vector<int> A(N);
  vector<int> spot(N, -1);
  vector<vector<int>> data(2e5 + 1);
  // data[i][j] := iがj番目に出現する時の座標 (0-indexed);

  // spot[i] := i番目の数と同じ数が次に出現する時の座標(0-indexd);

  rep(i, N) {
    cin >> A[i];
    data[A[i]].push_back(i);
  }
  rep(i, N) {
    // i番目の数と同じ数が次に出現する座標を求めていく
    int now = A[i];
    for (auto x : data[now]) {
      if (x > i) {
        spot[i] = x;
        break;
      }
    }
    if (spot[i] == -1) {
      // 右側にi番目の数と同じ数が出現しない場合は左側で1番最初に出現した数にする
      for (auto x : data[now]) {
        spot[i] = x;
        break;
      }
    }
    if (spot[i] == -1) {
      // 左側にも右側にも出現しない場合は1周させる
      spot[i] = i;
    }
  }
  // どれだけの数を進んだら、sが空で開始地点が0になるかを調べる
  ll dis = 0;
  ll X = 0;
  while (1) {
    ll next;
    // 現在地点はXで次にXと同じ数が出現する座標はspot[X]にある
    if (spot[X] > X) {
      // もしも右側にXと同じ数があった場合は
      next = spot[X];
      dis += next - X + 1;
      X = next;
    } else if (spot[X] <= X) {
      // 左側にXと同じ数があった場合は
      next = (spot[X] + N);
      dis += next - X + 1;
      X = next;
    }
    X++;
    X %= N;
    if (X == 0)
      break;
  }
  ll length = ((N * K) % dis) / N;
  vector<int> ans;
  if (length == 0)
    cout << "" << endl;
  else {

    length = length * N;
    for (ll i = 0; i < length; i++) {
      ll next = spot[i % N] + (i / N) * N;
      if (next % N <= i % N)
        next += N;
      if (next < length)
        i = next;
      else {
        ans.push_back(A[i % N]);
      }
    }
  }
  for (auto x : ans)
    cout << x << " ";
}