Cod sursa(job #1760519)

Utilizator preda.andreiPreda Andrei preda.andrei Data 20 septembrie 2016 21:34:28
Problema Stramosi Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.32 kb
#include <fstream>
#include <iostream>
#include <vector>

using namespace std;

const int kNoduriNivel = 500;

struct Nod
{
    int tata;
    int stramos;
    int nivel;
    int adancime;
};

int GasesteStramos(const vector<Nod> &arb, int start, int k)
{
    while (start > 0 && k > arb[start].adancime) {
        k -= arb[start].adancime;
        start = arb[start].stramos;
    }

    while (start > 0 && k > 0) {
        start = arb[start].tata;
        --k;
    }

    return start;
}

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

    int n, m;
    fin >> n >> m;

    vector<Nod> noduri(n + 1, {0, 0, 1, 1});
    for (int i = 1; i <= n; ++i) {
        fin >> noduri[i].tata;
        if (noduri[i].tata > 0) {
            int tata = noduri[i].tata;
            noduri[i].nivel = noduri[tata].nivel;
            noduri[i].adancime = noduri[tata].adancime + 1;
            noduri[i].stramos = noduri[tata].stramos;

            if (noduri[i].adancime > kNoduriNivel) {
                noduri[i].adancime = 1;
                ++noduri[i].nivel;
                noduri[i].stramos = tata;
            }
        }
    }

    while (m--) {
        int x, y;
        fin >> x >> y;
        fout << GasesteStramos(noduri, x, y) << "\n";
    }

    return 0;
}