Pagini recente » Cod sursa (job #2562101) | Cod sursa (job #1126270) | Cod sursa (job #3226423) | Cod sursa (job #2094901) | Cod sursa (job #2122705)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("stramosi.in");
ofstream fout("stramosi.out");
const int maxNodes = 250005;
vector <int> edges[maxNodes],
ancenstors[maxNodes];
int totalNodes, totalQueries;
vector <int> terminals;
bitset <maxNodes> visited;
int delays[maxNodes],
corespondence[maxNodes];
inline void readVariables(){
fin >> totalNodes >> totalQueries;
int source;
for ( int index = 1; index <= totalNodes; index++ ){
fin >> source;
edges[source].push_back(index);
}
}
inline void breadhFirstSearch(int startNode = 0){
queue <int> myQueue;
myQueue.push(startNode);
int currentNode;
for ( ; myQueue.size(); myQueue.pop()){
currentNode = myQueue.front();
for ( auto nextNode : edges[currentNode]){
ancenstors[nextNode].push_back(currentNode);
for ( auto source : ancenstors[currentNode]){
ancenstors[nextNode].push_back(source);
}
myQueue.push(nextNode);
}
if ( edges[currentNode].size() ){
ancenstors[currentNode].clear();
}
else{
terminals.push_back(currentNode);
visited[currentNode] = true;
corespondence[currentNode] = currentNode;
}
}
}
inline void selectNodes(){
for ( auto leaf : terminals ){
vector<int> :: iterator source;
for ( source = ancenstors[leaf].begin(); source < ancenstors[leaf].end(); source++ ){
if ( not visited[*source] ){
corespondence[*source] = leaf;
delays[*source] = source - ancenstors[leaf].begin()+1;
visited[*source] = true;
}
}
}
}
inline void displayAnswers(){
int node, grade, source;;
for ( ; totalQueries; totalQueries-- ){
fin >> node >> grade;
source = corespondence[node];
grade += delays[node];
if ( grade > ancenstors[source].size() )
fout << "0\n";
else
fout << ancenstors[source][grade-1] << "\n";
}
}
int main(){
readVariables();
breadhFirstSearch();
selectNodes();
displayAnswers();
return 0;
}