Cod sursa(job #2488229)

Utilizator AndreiD31Dragan Andrei AndreiD31 Data 6 noiembrie 2019 15:16:27
Problema Stramosi Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.2 kb
#include <bits/stdc++.h>

using namespace std;

ifstream f("stramosi.in");
ofstream g("stramosi.out");

int n,m,i,stramos,t,query,pas,k,tata[250100],d[20][250100];

int main()
{
    f>>n>>m;
    for(i=1;i<=n;i++)
    {
        f>>tata[i];
        d[0][i]=tata[i]; // 2^0=1 => stramosul direct
    }

    // acum facem dinamica. d[k][i] = al 2^k - lea stramos al lui i (d[k][i] = 0, daca nu exista un astfel de stramos)

    for(k=1;(1<<k)<=n;k++)
    {
        for(i=1;i<=n;i++)
        {
            d[k][i] = d[k-1][d[k-1][i]]; // d[k][i] = al 2^(k-1) - lea stramos al lui X, unde X este al 2^(k-1) - lea stramos al lui i. (2^(k-1) + 2^(k-1) = 2^k)
        }
    }


    for(query=1;query<=m;query++)
    {
        f>>i>>t;

        stramos=i;

        // descompunem pe t in puteri ale lui 2
        pas=0;
        while(t)
        {
            if(t%2==1) // am gasit o putere a lui 2
            {
                // merg in spate cu 2^(pas) stramsoi, si "reactualizez" nodul pt care mai fac restul stramosilor ramasi
                stramos=d[pas][stramos];
            }
            pas++;
            t=t/2;
        }

        g<<stramos<<'\n';
    }

    return 0;
}