Cod sursa(job #982934)

Utilizator danalex97Dan H Alexandru danalex97 Data 10 august 2013 15:00:21
Problema Stramosi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.15 kb
#include <fstream>
#include <vector>
using namespace std;

const int Nmax = 250010;
const int Lmax = 20;
const int root = 0;

ifstream F("stramosi.in");
ofstream G("stramosi.out");

int S[Lmax][Nmax],N,M,Log[Nmax];

int main()
{
    F>>N>>M;
    int co = 0;
    for (int i=1;i<=N;++i)
    {
        F>>S[0][i];
        co += (!S[0][i]);
    }
    for (int step=1;co>0;++step)
    {
        co = 0;
        for (int i=1;i<=N;++i)
        {
            if ( S[step-1][ S[step-1][i] ] == 0 )
                continue;
            S[step][i] = S[step-1][ S[step-1][i] ];
            ++co;
        }
    }
    for (int i=1,j=0;i<=N;i*=2,++j)
        Log[i] = j;
    for (int i=2;i<=N;++i)
        Log[i] = Log[i] == 0 ? Log[i-1] : Log[i];
    for (int i=1,nod,x;i<=M;++i)
    {
        F>>nod>>x;
        while ( x > 0 )
        {
            int bit = ( x & (x-1) ) ^ x;
            x -= bit;
            bit = Log[bit];
            if ( S[bit][nod] == 0 )
            {
                nod = 0;
                break;
            }
            else
                nod = S[bit][nod];
        }
        G<<nod<<'\n';
    }
}