Cod sursa(job #2806434)

Utilizator Ionut10Floristean Ioan Ionut10 Data 22 noiembrie 2021 17:27:24
Problema Stramosi Scor 80
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.11 kb
#include <bits/stdc++.h>
#define NMax 250000
#define LogMax 18

using namespace std;

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

int n, m;
int u, v;
int p, q;
int x;
vector<int> adj[NMax + 1], str;
int d[LogMax + 1][NMax + 1];

void query ( int q, int p )
{
    for ( int i = LogMax; i >= 0; i-- )
        if ( p & (1 << i) )
            q = d[i][q];
    fout << q << '\n';
}

void dfs ( int x, int p, int k )
{
    for ( auto v: adj[x] )
        if ( v != p )
        {
            d[k][v] = d[k - 1][d[k - 1][v]];
            dfs(v, x, k);
        }
}

int main()
{
    fin >> n >> m;
    for ( int i = 1; i <= n; i++ )
    {
        fin >> x;
        if ( x != 0 )
        {
            d[0][i] = x;
            adj[x].push_back(i);
            adj[i].push_back(x);
        }
        if ( x == 0 ) str.push_back(i);
    }
    for ( auto x: str )
        for ( int i = 1; i <= LogMax; i++ )
            dfs(x, x, i);
    //fout << d[1][5];
    for ( int i = 1; i <= m; i++ )
    {
        fin >> q >> p;
        query(q, p);
    }

    return 0;
}