Pagini recente » Cod sursa (job #262477) | Cod sursa (job #3033349) | Cod sursa (job #18774) | Cod sursa (job #1194897) | Cod sursa (job #3262585)
#include <fstream>
#include <vector>
using namespace std;
ifstream fin("stramosi.in");
ofstream fout("stramosi.out");
int dp[18][250005];
vector<int> level(250005, 0);
void DFS(int node, int parent, vector<vector<int>> &tree) {
level[node] = level[parent] + 1;
dp[0][node] = parent;
for(int i=1; (1 << i) < level[node]; i++) {
dp[i][node] = dp[i-1][dp[i-1][node]];
}
for(auto neighbor : tree[node]) {
if(neighbor != parent) {
DFS(neighbor, node, tree);
}
}
}
int main() {
int noNodes, queries;
fin >> noNodes >> queries;
vector<vector<int>> tree(noNodes+1, vector<int>());
for(int i=1; i<=noNodes; i++) {
int parent;
fin >> parent;
tree[parent].push_back(i);
}
for(auto e : tree[0]) {
DFS(e, 0, tree);
}
while(queries--) {
int node, stramosi;
fin >> node >> stramosi;
for(int i=17; i>=0; i--) {
if((1 << i) <= stramosi) {
node = dp[i][node];
stramosi -= (1<<i);
}
}
fout << node << '\n';
}
return 0;
}