Cod sursa(job #1386006)

Utilizator laurenttlaurentiu pavel laurentt Data 12 martie 2015 17:07:28
Problema Stramosi Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.55 kb
#include<vector>
#include<iostream>
#include<fstream>
#include<algorithm>
using namespace std;

int stack[250005];
vector<int> ancestors;
vector<int> descendants[250005];

vector<int> query[300005];
vector<int> solution[300005];
vector<int> zeros;
vector<pair<int, int> > queryInOrder;

void dfs(int pos, int depth) {
  //  cout << "pos:" << pos << " depth" << depth << " -> ";
  stack[depth] = pos;
  int q_size = query[pos].size();
  for(int i = 0; i < q_size; ++i) {
    //    cout << "qPos:" << query[pos][i] << " val:";
    if(query[pos][i] >= depth) {
      //  cout << "0";
      solution[pos][i] = 0;
    }
    else {
      //      cout << stack[depth - query[pos][i]];
      solution[pos][query[pos][i]] = stack[depth - query[pos][i]];
    }
  }
  //  cout << "\n";

  int d_size = descendants[pos].size();
  for(int i = 0; i < d_size; ++i) {
    dfs(descendants[pos][i], depth + 1);
  }
}

int main() {
  ifstream fin ("stramosi.in");
  ofstream fout("stramosi.out");

  int N,M;
  fin >> N >> M;

  ancestors.push_back(0);

  for(int i = 1; i <= N; ++i) {
    int x; fin >> x;
    ancestors.push_back(x);
    descendants[x].push_back(i);

    if(x == 0) {
      zeros.push_back(i);
    }
  }

  for(int i = 0; i < M; ++i) {
    int P,Q; fin >> Q >> P;
    query[Q].push_back(P);
    solution[Q].push_back(0);
    queryInOrder.push_back(make_pair(Q,P));
  }

  int z_size = zeros.size();
  for(int i = 0; i < z_size; ++i) {
    dfs(zeros[i], 1);
  }

  for(int i = 0; i < M; ++i) {
    fout << solution[queryInOrder[i].first][queryInOrder[i].second] << '\n';
  }
  
  return 0;
}