Cod sursa(job #2401297)

Utilizator Radu_FilipescuFilipescu Radu Radu_Filipescu Data 9 aprilie 2019 16:26:38
Problema Stramosi Scor 90
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 0.97 kb
#include <fstream>

using namespace std;

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

const int NMAX = 250005;

int N, T;
int mat[NMAX][20];

void Read()
{
  fin >> N >> T;

  for( int i = 1; i <= N; ++i )
    fin >> mat[i][0];
}

int BiggestPow( int val )
{
  if( val == 0 ) return -1;

  int ans = 0;

  while( true )
  {
    int aux = 1 << ( ans + 1 );

    if( aux > val ) return ans;
    else ++ans;
  }
}

void Do()
{
  int aux;

  for( int j = 1; j <= 19; ++j )
    for( int i = 1; i <= N; ++i )
    {
      aux = mat[i][j - 1];

      if( aux > 0 ) mat[i][j] = mat[aux][j - 1];
    }

  int nod, D;

  for( int i = 1; i <= T; ++i )
  {
    fin >> nod >> D;

    aux = BiggestPow( D );

    while( D > 0 )
    {
      nod = mat[nod][aux];

      D -= ( 1 << aux );

      aux = BiggestPow( D );
    }

    fout << nod << '\n';
  }
}

int main()
{
    Read();
    Do();

    return 0;
}