Cod sursa(job #1522990)

Utilizator EpictetStamatin Cristian Epictet Data 12 noiembrie 2015 12:11:37
Problema Stramosi Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.1 kb
#include <fstream>
#include <vector>

using namespace std;

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

int n, m, Log[250010], PD[20][250010];
vector < int > G[250010], V;

void DFS(int nod)
{
    V.push_back(nod);

    for (vector < int > :: iterator it = G[nod].begin(); it != G[nod].end(); it ++)
    {
        DFS(*it);
    }

    int aux = 0;
    while ((1 << aux) <= V.size() - 1)
    {
        PD[aux][nod] = V[V.size() - (1 << aux) - 1];
        aux ++;
    }
    V.pop_back();
}

int main()
{
    fin >> n >> m;
    Log[0] = -1;
    for (int i = 1, x; i <= n; i ++)
    {
        fin >> x;
        G[x].push_back(i);
        Log[i] = Log[i / 2] + 1;
    }

    for (vector < int > :: iterator it = G[0].begin(); it != G[0].end(); it ++)
    {
        DFS(*it);
    }

    for (int i = 1, nod, nr, x; i <= m; i ++)
    {
        fin >> nod >> nr;
        while (nr > 0)
        {
            x = Log[nr];
            nod = PD[x][nod];
            nr -= (1 << x);
        }
        fout << nod << '\n';
    }

    fout.close();
    return 0;
}