Cod sursa(job #2821684)

Utilizator lolismekAlex Jerpelea lolismek Data 22 decembrie 2021 21:27:24
Problema Stramosi Scor 90
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 0.79 kb
#include <iostream>
#include <fstream>

using namespace std;

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

// "binary lifting"
// dp[i][j] = al (2 ^ j) - lea stramos al nodului i; 
// dp[i][j] = dp[ dp[i][j - 1] ][j - 1]; dp[i][0] = val citita;
// pt un numar care nu e putere a lui 2, il descopunem oarecum in baza 2;

const int N = 250010, LOG = 19;
int dp[N][LOG]; 

int main() {
	int n, m;
	fin >> n >> m;
	for (int i = 1; i <= n; i++) fin >> dp[i][0];
	for (int j = 1; (1 << j) <= n; j++) 
		for (int i = 1; i <= n; i++)
			dp[i][j] = dp[dp[i][j - 1]][j - 1];
	while (m--) {
		int nod, target;
		fin >> nod >> target;
		int i = 0;
		while (target) {
			if (target & 1) nod = dp[nod][i];
			i++;
			target >>= 1;
		}
		fout << nod << '\n';
	}
	return 0;
}