Cod sursa(job #709895)

Utilizator andrici_cezarAndrici Cezar andrici_cezar Data 8 martie 2012 17:52:13
Problema Stramosi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.87 kb
#include <cstdio>

long a[20][250020], N, Q, st, nr, i, j, aux;

int log2(long x) {
	long nr = 0;
	
	for (; x > 1; x >>= 1, ++nr);

	return nr;
}

int stramos(long st, long nr) {
	long lognr = log2(nr);
	if (st == 0) {
		return 0;
	}
	if ((nr&(nr-1))==0) {
		if (a[lognr][st] != 0) {
			return a[lognr][st];
		}
	}
	while (a[lognr][st] == 0 && lognr != 0) {
		--lognr;
	}
	return stramos(a[lognr][st], nr-(1<<lognr));
}

int main() {
	freopen("stramosi.in","r",stdin);
	freopen("stramosi.out","w",stdout);
	
		scanf("%ld %ld", &N, &Q);
		
		for (i = 1; i <= N; ++i) {
			scanf("%ld", &a[0][i]);
		}
		
		for (i = 1, aux = log2(N); i <= aux; ++i) {
			for (j = 1; j <= N; ++j) {
				a[i][j] = a[i-1][ a[i-1][j] ];
			}
		}
		
		for (i = 0; i < Q; ++i) {
			scanf("%ld %ld", &st, &nr);
			printf("%ld\n", stramos(st, nr));
		}
	
	return 0;
}