Cod sursa(job #2986365)

Utilizator RobertAcAcatrinei Robert-Marian RobertAc Data 28 februarie 2023 13:15:04
Problema Stramosi Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.09 kb
#include <bits/stdc++.h>
// #define in cin
// #define out cout

using namespace std;

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

const int nmax = 2e5 + 5e4 + 5e0;

int dp[nmax][20]; // dp[nod][i] = stramosul al i^2 lea al lui nod
int n, m;

vector<int> adj[nmax];

void dfs(int nod)
{
    for (int i = 1; i < 20; i++)
    {
        dp[nod][i] = dp[dp[nod][i - 1]][i - 1];
    }

    for (auto i : adj[nod])
    {
        dfs(i);
    }
}

void readInput()
{
    in >> n >> m;
    for (int i = 1; i <= n; i++)
    {
        int t;
        in >> t;
        adj[t].push_back(i);
        dp[i][0] = t;
    }
}

int lastInd(int nr)
{
    int bit = 1;
    for (int i = 0; i < 32; i++)
    {
        if (bit & nr)
            return i;
        bit <<= 1;
    }
    return 0;
}

int query(int nod, int p)
{
    if(p==0)return nod;
    int bit = lastInd(p);
    return query(dp[nod][bit], p - (1 << bit));
}

void solution()
{
    for (int i = 0; i < m; i++)
    {
        int a, b;
        in >> a >> b;
        out << query(a, b) << '\n';
    }
}

int main()
{
    readInput();
    dfs(0);
    solution();
}