Pagini recente » Cod sursa (job #2624719) | Cod sursa (job #400091) | Cod sursa (job #2044682) | Cod sursa (job #2052647) | Cod sursa (job #2123299)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("stramosi.in");
ofstream fout("stramosi.out");
const int maxNodes = 250005;
int directSource[maxNodes],
corespondance[maxNodes],
delays[maxNodes];
bitset <maxNodes> isLeaf, visited;
vector <int> leaves, ancestors[maxNodes];
int totalNodes, totalQueries;
inline void readVariables(){
isLeaf.set();
fin >> totalNodes >> totalQueries;
int source;
for ( int index = 1; index <= totalNodes; index++ ){
fin >> source;
directSource[index] = source;
isLeaf[source] = false;
}
}
inline void makeCorespondance(){
for ( int index = 1; index <= totalNodes; index++ ){
if ( isLeaf[index] ){
corespondance[index] = index;
leaves.push_back(index);
int source, currentNode, delay;
currentNode = index;
source = directSource[index];
delay = 1;
while ( source ){
visited[source] = true;
corespondance[source] = index;
delays[source] = delay++;
ancestors[index].push_back(source);
currentNode = source;
source = directSource[currentNode];
}
ancestors[index].shrink_to_fit();
}
}
for ( int index = 1; index <= totalNodes; index++ )
cout << index << ": " << delays[index] << "\n";
}
inline void answerQuestions(){
int node, grade, leaf;
for ( ; totalQueries; totalQueries-- ){
fin >> node >> grade;
leaf = corespondance[node];
grade += delays[node];
if ( grade > ancestors[leaf].size() )
fout << "0\n";
else
fout << ancestors[leaf][grade-1] << "\n";
}
}
int main(){
readVariables();
makeCorespondance();
answerQuestions();
return 0;
}