Cod sursa(job #3348729)

Utilizator MMEnisEnis Mutlu MMEnis Data 23 martie 2026 18:33:02
Problema Stramosi Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.06 kb
#include <bits/stdc++.h>

using namespace std;

ifstream f("stramosi.in");
ofstream g("stramosi.out");

const int NMAX = 250001, LOGMAX = 17;

int anc[NMAX][LOGMAX + 1];
vector <int> adj[NMAX];
vector <int> roots;

void dfs ( int nod )
{
    for ( int i = 1; i <= LOGMAX && anc[nod][i - 1] > 0; i ++ )
        anc[nod][i] = anc[anc[nod][i - 1]][i - 1];
    for ( auto it : adj[nod] )
        dfs ( it );
}

int query ( int nod, int exp )
{
    for ( int i = LOGMAX; i >= 0; i -- )
    {
        if ( ( 1 << i ) <= exp )
        {
            nod = anc[nod][i];
            exp -= ( 1 << i );
        }
    }
    return nod;
}

int main()
{
    int n, q, x;
    f >> n >> q;
    for ( int i = 1; i <= n; i ++ )
    {
        f >> x;
        anc[i][0] = x;
        adj[x].push_back(i);
        if ( x == 0 )
            roots.push_back(i);
    }
    for ( auto it : roots )
        dfs ( it );
    while ( q -- )
    {
        int nod, grad;
        f >> nod >> grad;
        g << query ( nod, grad ) << '\n';
    }
    return 0;
}