Pagini recente » Monitorul de evaluare | Cod sursa (job #421954) | Profil angeleyes | Cod sursa (job #2363684) | Cod sursa (job #199007)
Cod sursa(job #199007)
#include <cstdio>
const int N = 250000;
const int lgN = 18;
const int M = 300000;
int n,m;
int p[N];
int s[lgN][N];
inline int query ( int x, int k ) {
int w = x,y = k;
for (int i = 0; y && w != -1; y /= 2, ++i) {
if (y % 2) {
w = s[i][w];
}
}
return w;
}
void pre() {
for (int i = 0; i < n; ++i) s[0][i] = p[i];
for (int lg = 1; (1 << lg) <= n; ++lg)
for (int i = 0; i < n; ++i)
s[lg][i] = (s[lg-1][i] != -1) ? s[lg-1][s[lg-1][i]] : -1;
}
int main() {
freopen("stramosi.in","rt",stdin);
freopen("stramosi.out","wt",stdout);
scanf("%d %d",&n,&m);
for (int i = 0; i < n; ++i) {
scanf("%d",&p[i]);
--p[i];
}
pre();
for (int i = 0, a, b; i < m; ++i) {
scanf("%d %d",&a,&b);
--a;
printf("%d\n",query(a,b)+1);
}
return 0;
}