Cod sursa(job #3242087)

Utilizator Sasha_12454Eric Paturan Sasha_12454 Data 8 septembrie 2024 16:39:12
Problema Stramosi Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.11 kb
#include <bits/stdc++.h>

const std :: string FILENAME = "stramosi";

std :: ifstream in (FILENAME + ".in");

std :: ofstream out (FILENAME + ".out");

const int NMAX = 25e4 + 5;

const int LOGMAX = 18;

int n;

int m;

int x;

int y;

int p;

int q;

int parent[NMAX];

int dp[LOGMAX][NMAX];

void precalc()
{
    for(int i = 1; i <= n; i ++)
    {
        dp[0][i] = parent[i];
    }

    for(int i = 1; i < LOGMAX; i ++)
    {
        for(int j = 1; j <= n; j ++)
        {
            dp[i][j] = dp[i - 1][dp[i - 1][j]];// al 2 ^ilea stramos al lui nodului j
        }
    }
}

inline int find(int nod, int stramos)
{
    for(int shift = LOGMAX - 1; shift >= 0; shift --)
    {
        if(stramos & (1 << shift))
        {
            nod = dp[shift][nod];

            stramos ^= (1 << shift);
        }
    }

    return nod;
}

int main()
{

    in >> n >> m;

    for(int i = 1; i <= n; i ++)
    {
        in >> parent[i];
    }

    precalc();

    while(m --)
    {
        in >> q >> p;

        out << find(q, p) << '\n';
    }

    return 0;
}