Cod sursa(job #3345087)

Utilizator Gabriel_DaescuDaescu Gabriel Florin Gabriel_Daescu Data 7 martie 2026 21:41:39
Problema Stramosi Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.14 kb
#include <fstream>
#include <vector>
#define NMAX 250002
using namespace std;
ifstream  fin("stramosi.in");
ofstream fout("stramosi.out");
int N,M,rad,tata[NMAX],up[NMAX][1<<14];
vector<int> tree[NMAX];

void citire()
{
    fin>>N>>M;

    for(int i=1; i<=N; i++)
    {
        fin>>tata[i];

        if(!tata[i])
        {
            rad=i;
        }
        tree[tata[i]].push_back(i);
    }
}

void DFS(int nod)
{
    for(int i=0; i<tree[nod].size(); i++)
    {
        int next_nod=tree[nod][i];
        up[next_nod][0]=nod;

        for(int j=1; j<14; j++)
        {
            up[next_nod][j]=up[up[next_nod][j-1]][j-1];
        }

        DFS(next_nod);
    }
}

int Binary_lift(int nod, int k)
{
    for(int i=13; i>=0; i--)
    {
        if(k&(1<<i))
        {
            nod=up[nod][i];

            if(!nod)
            {
              return 0;
            }
        }
    }
    return nod;
}

int main()
{
    rad=0;
    citire();

    DFS(rad);

    int Q,P;
    for(int i=1; i<=M; i++)
    {
        fin>>Q>>P;

        fout<< Binary_lift(Q,P) << "\n";
    }

    return 0;
}