Cod sursa(job #943036)

Utilizator AnonymouslegionAnonymous Anonymouslegion Data 24 aprilie 2013 09:11:16
Problema Stramosi Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.85 kb
#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;
}