Cod sursa(job #2122632)

Utilizator AkrielAkriel Akriel Data 5 februarie 2018 12:48:52
Problema Stramosi Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.36 kb
#include <bits/stdc++.h>

using namespace std;

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

const int maxNodes = 250005;

vector <int> edges[maxNodes];

int totalNodes, totalQueries;

vector <int> ancenstors[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);
        }
    }
}

inline void displayAnswers(){
    int node, grade;
    for ( ; totalQueries; totalQueries-- ){
        fin >> node >> grade;
        if ( grade > ancenstors[node].size() )
            fout << "0" << "\n";
        else
            fout << ancenstors[node][grade-1] << "\n";
    }
}

int main(){
    readVariables();
    breadhFirstSearch();
    displayAnswers();
    return 0;
}