Pagini recente » Cod sursa (job #2212261) | Cod sursa (job #115345) | Cod sursa (job #984098) | Cod sursa (job #3256593) | Cod sursa (job #943036)
Cod sursa(job #943036)
#include<fstream>
#include<vector>
using namespace std;
vector<int> stack, graph[250005];
int n, m, vis[250005], dp[18][250005];
void dfs(int x){
vis[x] = 1;
for(int i = 0; i < 18; ++i){
int t = 1 << i;
if(t > stack.size())
break;
dp[i][x] = stack[stack.size() - t];
}
stack.push_back(x);
for(int i = 0; i < graph[x].size(); ++i)
if(!vis[graph[x][i]])
dfs(graph[x][i]);
stack.pop_back();
}
int query(int &vert, int &anc){
for(int i = 0; i < 18; ++i)
if(anc & (1 << i))
vert = dp[i][vert];
return vert;
}
int main(){
ifstream in("stramosi.in");
ofstream out("stramosi.out");
in >> n >> m;
for(int i = 1; i <= n; ++i){
int x;
in >> x;
graph[x].push_back(i);
}
dfs(0);
int x, y;
for(int i = 1; i <= m; ++i){
in >> x >> y;
out << query(x, y) << "\n";
}
return 0;
}