Cod sursa(job #199007)

Utilizator tvladTataranu Vlad tvlad Data 16 iulie 2008 17:14:29
Problema Stramosi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.74 kb
#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;
}