Cod sursa(job #2122716)

Utilizator AkrielAkriel Akriel Data 5 februarie 2018 13:52:46
Problema Stramosi Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.31 kb
#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();
            ancenstors[currentNode].shrink_to_fit();
        }
        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;
}