Pagini recente » Cod sursa (job #1409267) | Cod sursa (job #140873) | Cod sursa (job #59680) | Cod sursa (job #2550292) | Cod sursa (job #2942742)
#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';
}
}