Pagini recente » Cod sursa (job #858004) | Cod sursa (job #2747409) | Cod sursa (job #2435887) | Cod sursa (job #656824) | Cod sursa (job #1428233)
#include <fstream>
#include <iostream>
#include <vector>
#include <cmath>
#include <set>
#include <map>
#include <algorithm>
#define LL long long
#define DN 250005
using namespace std;
int anc[30][DN], power2[30];
int biggest_power(int x, int &i){
int left = 0, right = 20, mid;
while(left < right - 1){
mid = (left + right) / 2;
if(power2[mid] == x){
i = power2[mid];
return mid;
}
if(power2[mid] < x){
left = mid;
}
else
right = mid;
}
i = power2[left];
return left;
}
int find_anc(int x, int p){
if(p == 0)
return x;
int res;
int power = biggest_power(p, res);
return find_anc(anc[power][x], p - res);
}
int main() {
int n, m, x, p;
ifstream fin("stramosi.in");
ofstream fout("stramosi.out");
for(int i = 0, j = 1; i <= 20; ++i, j *= 2)
power2[i] = j;
fin >> n >> m;
for(int i = 1; i <= n; ++i){
fin >> anc[0][i];
}
for(int j = 1; j < 20; ++j)
for(int i = 1; i <= n; ++i){
anc[j][i] = anc[j-1][anc[j-1][i]];
}
for(int i = 0; i < m; ++i){
fin >> x >> p;
fout << find_anc(x, p) << '\n';
}
return 0;
}