Pagini recente » Borderou de evaluare (job #2022981) | Cod sursa (job #3147503) | Cod sursa (job #455165) | Borderou de evaluare (job #2022982) | Cod sursa (job #2158326)
#include <bits/stdc++.h>
using namespace std;
//al 2^k - lea stramos a fiecarui nod;
int n, m, p, q, dp[30][250010], pr[250010];
//preprocesare
void build(){
int lmax = log2(n);
//for (int i=1; i<=n; i++) dp[0][i] = i;
for (int put = 1; put<=lmax; put++){
for (int i=1; i<=n; i++){
dp[put][i] = dp[put-1][dp[put-1][i]]; //al 2^(k-1) -lea stramos al 2^(k-1) -lea stramos;
}
}
}
int get(int nod, int dist){
if (!dist) return nod;
int put = 0;
while ( (1 << (put + 1)) <= dist) put++;
return get(dp[put][nod], dist - (1<<put));
}
int main(){
ios_base::sync_with_stdio(0); cin.tie(0);
ifstream cin ("stramosi.in");
ofstream cout ("stramosi.out");
cin >> n >> m;
for (int i=1; i<=n; i++) cin >> dp[0][i];
build();
while (m--){
cin >> q >> p;
cout << get(q, p) << "\n";
}
return 0;
}