Cod sursa(job #2123301)

Utilizator AkrielAkriel Akriel Data 6 februarie 2018 01:53:03
Problema Stramosi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.7 kb
#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;
}