Cod sursa(job #812748)

Utilizator toranagahVlad Badelita toranagah Data 14 noiembrie 2012 13:18:46
Problema Stramosi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.84 kb
#include <fstream>
using namespace std;
ifstream fin("stramosi.in");
ofstream fout("stramosi.out");
const int MAX_N = 256000;
int s[20][MAX_N];
int N, M;

void read();
void pre();
void answer();
int query(int, int);


int main() {
	read();
	pre();
	answer();
	return 0;
}

void read() {
	fin >> N >> M;
	for (int i = 1; i <= N; ++i) {
		fin >> s[0][i];
	}
}

void pre() {
	for (int i = 1; i < 20; ++i) {
		for (int j = 1; j <= N; ++j) {
			s[i][j] = s[i-1][s[i-1][j]];
		}
	}
}

void answer() {
	int q, p;
	for (int i = 1; i <= M; ++i) {
		fin >> q >> p;
		fout << query(q, p) << '\n';
	}
}

int query(int nod, int dist) {
	if (dist == 0) return 0;
	int result = 0;
	for (int i = 20; i >= 0; --i) {
		if (!((1 << i) & dist)) continue;
		if ((1 << i) == dist) {
			result = s[i][nod];
		} else {
			nod = s[i][nod];
			dist ^= (1 << i);
		}
	}
	return result;
}