Cod sursa(job #487974)

Utilizator toniobFMI - Barbalau Antonio toniob Data 27 septembrie 2010 10:21:30
Problema Stramosi Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.7 kb
#include <cstdio>

int n, m, a[18][1 << 18];

void citire () {
	freopen ("stramosi.in", "r", stdin);
	freopen ("stramosi.out", "w", stdout);
	scanf ("%d%d", &n, &m);
	for (int i = 1; i <= n; ++i) {
		scanf ("%d", &a[0][i]);
	}
}

void construire () {
	for (int i = 1; i <= 18; ++i) {
		for (int j = 1; j <= n; ++j) {
			a[i][j] = a[i - 1][a[i - 1][j]];
		}
	}
}

int stramosi (int p, int q) {
	for (int i = 0; p; ++i, p >>= 1) {
		if (p & 1) {
			q = a[i][q];
		}
	}
	return q;
}

void exe () {
	for (int i = 1, p, q; i <= m; ++i) {
		scanf ("%d%d", &q, &p);
		printf ("%d\n", stramosi (p, q));
	}
}

int main () {
	citire ();
	
	construire ();
	
	exe ();
	
	return 0;
}