Pagini recente » preONI 2008 - Runda 4 | Clasament Junior Challenge 2012 | Cod sursa (job #2904875) | Cod sursa (job #1671630) | Cod sursa (job #2123301)
#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;
vector <int> 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;
int source, currentNode, delay;
currentNode = index;
source = directSource[index];
delay = 1;
while ( source ){
corespondance[source] = index;
delays[source] = delay++;
ancestors[index].push_back(source);
currentNode = source;
source = directSource[currentNode];
}
ancestors[index].shrink_to_fit();
}
}
}
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;
}