Pagini recente » Cod sursa (job #1417473) | Cod sursa (job #3278955) | Cod sursa (job #2691210) | Cod sursa (job #3181607) | Cod sursa (job #2614377)
#include <iostream>
using namespace std;
#define maxn 250001
int tata[maxn][20];
// urcam cu puteri a lui 2 strict mai mici ca k
// practic daca k = 7 urcam 4 apoi 2 apoi 1
int solve(const int& nod, const int& k) {
int k_actual = k;
int div_nivel = (1<<20);
int rez = nod;
for (int putere = 20; putere >= 0; putere--, div_nivel/=2) {
if (div_nivel <= k) {
rez = tata[rez][putere];
k_acutal -= div_nivel;
}
}
return rez;
}
int main()
{
freopen("stramosi.in","r",stdin);
freopen("stramosi.out","w",stdout);
scanf("%d %d", &n, &m);
for (int i = 1; i <= n; ++i) {
scanf("%d", &tata[i][0]);
}
int putere = 2;
for (int j = 1; putere < n; ++j, putere *= 2) {
for (j = 1; j <= n; ++j) {
tata[j][i] = tata[tata[j][i-1]][i-1];//stramosul meu va fi tatal tatalui meu
}
}
for (int i = 0; i < m; ++i) {
int nod, k;
scanf("%d %d", &nod, &k);
solve(nod, k);
}
return 0;
}