Cod sursa(job #3186867)

Utilizator livliviLivia Magureanu livlivi Data 26 decembrie 2023 10:32:21
Problema Stramosi Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 0.92 kb
// #include <iostream>
#include <fstream>
#include <vector>

using namespace std;

ifstream cin("stramosi.in");
ofstream cout("stramosi.out");

class Stra {
public:
	Stra(vector<int>& v) {
		n = v.size();
		p = 0;
		while ((1 << p) <= n) { p++; }
		p--;

		anc.resize(p + 1, vector<int>(n + 1));
		for (int i = 0; i < n; i++) {
			anc[0][i + 1] = v[i];
		}

		for (int j = 0; j < p; j++) {
			for (int i = 1; i <= n; i++) {
				anc[j + 1][i] = anc[j][anc[j][i]];
			}
		}	
	}

	int find(int a, int k) {
		for (int pas = p; pas >= 0; pas--) {
			if (k & (1 << pas)) {
				a = anc[pas][a];
			}
		}
		return a;
	}

private:
	int p = 0;
	int n = 0;

	vector<vector<int>> anc;
};

void Solve() {
	int n, q; cin >> n >> q;
	vector<int> v(n);
	for (int i = 0; i < n; i++) {
		cin >> v[i];
	}

	Stra stra(v);

	for (int i = 0; i < q; i++) {
		int a, b; cin >> a >> b;
		cout << stra.find(a, b) << "\n";
	}
}

int main() {
	Solve();
	return 0;
}