Cod sursa(job #1803821)

Utilizator mirceadinoMircea Popoveniuc mirceadino Data 11 noiembrie 2016 22:12:59
Problema Stramosi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.85 kb
#include <bits/stdc++.h>

using namespace std;

#define dbg(x) (cout<<#x<<" = "<<(x)<<'\n')

typedef long long int lld;
const int INF = (1LL << 30) - 1;
const lld LINF = (1LL << 62) - 1;
const int NMAX = 250000;
const int LMAX = 17;

int N, M;
int dad[LMAX + 1][NMAX + 5];

int query(int x, int p) {
  for (int i = 0; (1 << i) <= p && x; ++i) {
    if (p & (1 << i)) {
      x = dad[i][x];
    }
  }
  return x;
}

int main() {
  cin.sync_with_stdio(false);

  freopen("stramosi.in", "r", stdin);
  freopen("stramosi.out", "w", stdout);

  scanf("%d%d", &N, &M);

  for (int i = 1; i <= N; ++i) {
    scanf("%d", &dad[0][i]);
  }

  for (int k = 1; (1 << k) <= N; ++k) {
    for (int i = 1; i <= N; ++i) {
      dad[k][i] = dad[k - 1][dad[k - 1][i]];
    }
  }

  while (M--) {
    int x, p;
    scanf("%d%d", &x, &p);
    printf("%d\n", query(x, p));
  }

  return 0;
}