Cod sursa(job #998922)

Utilizator Andrei1998Andrei Constantinescu Andrei1998 Data 18 septembrie 2013 19:19:51
Problema Stramosi Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.94 kb
#include <fstream>

using namespace std;

int n,tata[250005];
int din[18][250005];
int log2[250005];

inline void calc_log()
{
    int i=2;
    log2[1]=0;
    for(;i<=n;i++)
        log2[i]=log2[i/2]+1;
}

void precalc()
{
    int i,j,lg=log2[n];
    for(i=1;i<=n;i++)
        din[0][i]=i;
    for(i=1;i<=lg;i++)
        for(j=1;j<=n;j++)
            din[i][j]=din[i-1][tata[din[i-1][j]]];

}

#define lsb(x) (x&(-x))

int main()
{
    ifstream cin("stramosi.in");
    ofstream cout("stramosi.out");

    int i,m=0,a,l,rasp,k;
    cin>>n>>m;
    for(i=1;i<=n;i++)
        cin>>tata[i];
    calc_log();
    precalc();
    for(i=0;i<m;i++)
    {
        cin>>a>>l;
        rasp=a;
        while(l)
        {
            k=log2[lsb(l)];
            rasp=tata[din[k][rasp]];
            //k++;
            l-=lsb(l);
        }
        cout<<rasp<<'\n';
    }

    cin.close();
    cout.close();
    return 0;
}