Cod sursa(job #2942742)

Utilizator juincPopescu Marian juinc Data 19 noiembrie 2022 23:51:03
Problema Stramosi Scor 30
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1 kb
#include <fstream>
#include <vector>

inline int stramosi(int& P, int& Q, std::vector<std::vector<int>> A )
{
    int k = 18;

    while ( P )
    {
        while ( ( 1 << k ) > P ) {
            --k;
        }

        P -= ( 1 << k );
        Q = A[ k ][ Q ];
    }

    return Q;
}

inline void build( std::vector<std::vector<int>>& A, int n )
{
    for ( int i = 1; i < 19; i++ ) {
        for ( int j = 1; j <= n; j++ )
        {
            A[ i ][ j ] = A[ i - 1 ][ A[ i - 1 ][ j ] ];
        }
    }
}

int main( )
{
    std::ifstream fin( "stramosi.in" );
    std::ofstream fout( "stramosi.out" );

    int n, m;
    fin >> n >> m;

	std::vector<std::vector<int>> A( 20, std::vector<int>( n + 1, 0 ) );

    for ( int i = 1; i <= n; i++ )
    {
        int t;
        fin >> t;

        A[ 0 ][ i ] = t;
    }

    build( A, n );

    for (int i = m ; i >= 0; i-- )
    {
        int Q, P;
		fin >> Q >> P;

        fout << stramosi(P,Q,A) << '\n';
    }
}