Cod sursa(job #1114353)

Utilizator SmarandaMaria Pandele Smaranda Data 21 februarie 2014 15:44:49
Problema Stramosi Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.11 kb
#include <fstream>
#include <vector>

using namespace std;

ifstream fin ("stramosi.in");
ofstream fout ("stramosi.out");

const long N = 250001;
long n, m, s [N], dp [20][250001], lg [20], lg2 [N];

void read () {
	long i;
	fin >> n >> m;
	for (i = 1; i <= n; i ++) {
		fin >> s [i];
		dp [0][i] = s [i];
	}
	lg [0] = 1;
	for (i = 1; i <= 17; i ++) {
		lg [i] = lg [i - 1] << 1;
		lg2 [lg [i]] = i;
	}
}

void solve () {
	long i, j, p2 = 1;
	for (i = 1; ; i ++) {
		p2 = p2 << 1;
		if (p2 > n)
			break;
		for (j = 1; j <= n; j ++)
			dp [i][j] = dp [i - 1][dp [i - 1][j]];
	}
}

long bs (const long &a) {
	long step, i;
	step = (1 << 19);
	for (i = 0;  step; step >>= 1)
		if (i + step <= 20 && lg [i + step] <= a)
			i += step;
		return lg [i];
}

long query (long a, long b)  {
	long i, p, p2;
	if ((b & (b - 1)) == 0) {
			p = lg2 [b];
		return dp [p][a];
	}
	p2 = bs (b);
	p = lg2 [p2];
	return query (dp [p][a], b - p2);
}

int main () {
	long i, a, b;
	read ();
	solve ();
	for (i = 1; i<= m; i ++) {
		fin >> a >> b;
		fout << query (a, b) << "\n";
	}
	return 0;
}