Pagini recente » Cod sursa (job #1237968) | Cod sursa (job #1775494) | Cod sursa (job #2603336) | Cod sursa (job #2429898) | Cod sursa (job #196079)
Cod sursa(job #196079)
#include <cstdio>
const int N = 250000;
const int lgN = 18;
const int M = 300000;
int n,m;
int p[N];
int s[N][lgN];
int query ( int x, int k ) {
if (x < 0) return -1;
if (k == 0) return x;
int msb; for (msb = 17; msb && !((1 << msb) & k); --msb);
if (s[x][msb] == -1)
return -1; else
return query(s[x][msb], k & ((1 << 31) - 1 - (1 << msb)));
}
void pre() {
for (int i = 0; i < n; ++i) s[i][0] = p[i];
for (int lg = 1; (1 << lg) <= n; ++lg)
for (int i = 0; i < n; ++i)
s[i][lg] = query(s[i][0],(1 << lg)-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;
}