Cod sursa(job #943048)

Utilizator AnonymouslegionAnonymous Anonymouslegion Data 24 aprilie 2013 09:26:15
Problema Stramosi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.1 kb
#include<fstream>
#include<vector>

using namespace std;

class stiv{
public:
  int v, i;

  stiv(){};

  stiv(int v1, int i1){
    v = v1;
    i = i1;
  }
};

vector<int> graph[280005];
int n, m, dp[19][280005];
vector<stiv> stack;

void dfs(){
  stack.push_back(stiv(0, -1));

  int wh;
  while(!stack.empty()){
    wh = stack.size() - 1;
    ++stack[wh].i;
    if(stack[wh].i >= graph[stack[wh].v].size()){
      stack.pop_back();
      continue;
    }

    int y = graph[stack[wh].v][stack[wh].i];

    for(int i = 0; i < 18; ++i){
      int t = 1 << i;
      if(t > stack.size())
        break;
      dp[i][y] = stack[stack.size() - t].v;
    }

    stack.push_back(stiv(y, -1));
  }

}

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();

  int x, y;

  for(int i = 1; i <= m; ++i){
    in >> x >> y;

    out << query(x, y) << "\n";
  }

  return 0;
}