Cod sursa(job #1150376)

Utilizator alexandru70Ungurianu Alexandru alexandru70 Data 22 martie 2014 22:07:22
Problema Stramosi Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.12 kb
#include <fstream>
#include <vector>

using namespace std;

ifstream in("stramosi.in");

size_t n,m;

vector<unsigned> parent;

vector<vector<int>> ancestorCache;

unsigned getAncestor(size_t depth, unsigned id) {
    if(ancestorCache.size() <= depth)
        ancestorCache.resize(depth+1,vector<int>(n+1,-1));

    if(ancestorCache[depth][id]!=-1) return ancestorCache[depth][id];
    if(parent[id] == 0)
        ancestorCache[depth][id] = 0;
    else {
        if(depth == 1) {
            ancestorCache[depth][id] = parent[id];
        }
        else {
            ancestorCache[depth][id] = getAncestor(depth-1,parent[id]);
        }
    }

    return ancestorCache[depth][id];
}

void ReadData() {
    in >> n >> m;
    parent.resize(n+1);
    for(size_t i = 1; i <= n; ++i)
        in >> parent[i];
}

void SolveQueries() {
    ofstream out("stramosi.out");

    for(size_t i = 0; i < m; ++i) {
        size_t depth;
        unsigned nd;
        in >> nd >> depth;
        out << getAncestor(depth,nd) << '\n';
    }
}

int main() {
    ReadData();
    SolveQueries();
    return 0;
}