Pagini recente » Cod sursa (job #2778715) | Cod sursa (job #3173034) | Cod sursa (job #2288504) | Cod sursa (job #296528) | Cod sursa (job #196080)
Cod sursa(job #196080)
#include <cstdio>
const int N = 250000;
const int lgN = 18;
const int M = 300000;
int n,m;
int p[N];
int s[lgN][N];
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[msb][x] == -1)
return -1; else
return query(s[msb][x], k & ((1 << 31) - 1 - (1 << msb)));
}
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] = query(s[0][i],(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;
}