Pagini recente » Cod sursa (job #916817) | Cod sursa (job #2307389) | Cod sursa (job #1044174) | Cod sursa (job #1717958) | Cod sursa (job #2506680)
#include <bits/stdc++.h>
using namespace std;
ifstream in("stramosi.in");
ofstream out("stramosi.out");
typedef long long ll;
typedef unsigned long long ull;
const ll nmx = 3e5 + 5;
const ll inf = 1<<30;
const ll MOD = 1e9 + 7;
int N, M, v[nmx], anc[nmx][21], lg[nmx], lvl[nmx];
vector <int> fiu[nmx];
int stramos(int node, int k) {
if(v[node] == 0 || k > lvl[node] - 1) return 0;
int l = lg[k];
if(anc[node][l] != 0 && (1 << l) == k) {
return anc[node][l];
}
return stramos(anc[node][l], k - (1<<l));
}
int main() {
ios::sync_with_stdio(0);
lg[2] = 1;
for(int i = 3; i <= 250000; ++i) {
lg[i] = 1 + lg[i / 2];
}
in>>N>>M;
for(int i = 1; i <= N; ++i) {
in>>v[i];
lvl[i] = lvl[i - 1] + 1;
if(v[i] != 0) {
anc[i][0] = v[i];
for(int j = 1; (1<<j) < lvl[i]; ++j) {
anc[i][j] = anc[anc[i][j - 1]][j - 1];
}
}
}
while(M--) {
ll P, Q;
in>>P>>Q;
out<<stramos(P, Q)<<"\n";
}
return 0;
}