Pagini recente » Cod sursa (job #1495078) | Cod sursa (job #2252759) | Cod sursa (job #795078) | Cod sursa (job #920504) | Cod sursa (job #2506700)
#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 = 250000 + 5;
const ll inf = 1<<30;
const ll MOD = 1e9 + 7;
int N, M, v[nmx], anc[nmx][18], lg[nmx], lvl[nmx];
int stramos(int node, int k) {
if(v[node] == 0 || k > lvl[node] - 1) return 0;
if(anc[node][lg[k]] != 0 && (1 << lg[k]) == k) {
return anc[node][lg[k]];
}
return stramos(anc[node][lg[k]], k - (1<<lg[k]));
}
int main() {
ios::sync_with_stdio(0);
in>>N>>M;
lg[2] = 1;
for(int i = 3; i <= N + 1; ++i) {
lg[i] = 1 + lg[i / 2];
}
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;
if(v[P] == 0 || Q > lvl[P] - 1) out<<0<<"\n";
else out<<stramos(P, Q)<<"\n";
}
return 0;
}