Cod sursa(job #129879)

Utilizator scvalexAlexandru Scvortov scvalex Data 30 ianuarie 2008 15:25:12
Problema Stramosi Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.87 kb
#include <iostream>
#include <fstream>

using namespace std;

int N(0),
	M(0),
	prev[250001],
	P(0),
	Q(0),
	A[18][250001];

int main(int argc, char *argv[]) {
	ifstream fin("stramosi.in");
	fin >> N >> M;
	for (int i(1); i <= N; ++i) {
		fin >> prev[i];
		A[0][i] = prev[i];
	}

	for (int k(1); k < 19; ++k) 
		for (int i(1); i <= N; ++i)
			A[k][i] = A[k - 1][A[k - 1][i]];

	/*for (int i(0); i < 19; ++i) {
		for (int j(1); j <= N; ++j)
			cout << A[i][j] << "  ";
		cout << endl;
	}*/

	ofstream fout("stramosi.out");
	while (M--) {
		fin >> Q >> P;
		//cout << Q << endl;
		while (P && Q) {
			int p = 1;
			int i = 0;
			while (p <= P) {
				p *= 2;
				++i;
			}
			if (p > P) {
				p /= 2;
				--i;
			}
			//cout << p << " " << i << endl;
			Q = A[i][Q];
			P -= p;
			//cout << "--- " << Q << " " << P << endl;
		}
		fout << Q << endl;
	}
	fout.close();
	fin.close();

	return 0;
}