Cod sursa(job #2878623)

Utilizator andrei81Ragman Andrei andrei81 Data 27 martie 2022 13:29:21
Problema Stramosi Scor 80
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.11 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <cmath>

using namespace std;

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

int n, m, q, p, aux;
vector<int> G[250005];
vector<int> Anc[250005];
vector<int> roots;
int ancestors[250005];

void dfs(int x, int k)
{
    for ( int i = 0; (1 << i) <= k; i++ )
        Anc[x].push_back(ancestors[k - (1 << i) + 1]);

    ancestors[k + 1] = x;

    for ( int a : G[x] )
        dfs(a, k + 1);
}

int main()
{
    fin >> n >> m;

    for ( int i = 1; i <= n; i++ )
    {
        fin >> q;

        if ( q == 0 )
            roots.push_back(i);
        else
            G[q].push_back(i);
    }

    for ( int root : roots )
        dfs(root, 0);

    for ( int i = 1; i <= m; i++ )
    {
        fin >> q >> p;

        while ( p )
        {
            if ( (( int )(log2(p))) >= Anc[q].size() )
            {
                q = 0;
                break;
            }
            q = Anc[q][(( int )(log2(p)))];
            p -= (1 << ( int )(log2(p)));
        }

        fout << q << "\n";
    }
}