Cod sursa(job #129885)

Utilizator scvalexAlexandru Scvortov scvalex Data 30 ianuarie 2008 15:29:46
Problema Stramosi Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.92 kb
#include <iostream>
#include <fstream>

using namespace std;

int N(0),
	M(0),
	prev[250001],
	P(0),
	Q(0),
	A[19][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 << "Start: " << Q << " " << P  << endl;
		while (P && Q) {
			int p = 1;
			int i = 0;
			while (p <= P) {
				p *= 2;
				++i;
			}
			if (p > P) {
				p /= 2;
				--i;
			}
			Q = A[i][Q];
			P -= p;
			//cout << "---    " << Q << " " << P << endl;
		}
		//cout << "Stop:  " << Q << " " << P << endl << endl;
		fout << Q << endl;
	}
	fout.close();
	fin.close();

	return 0;
}