Cod sursa(job #1380037)

Utilizator emanuel_rRamneantu Emanuel emanuel_r Data 6 martie 2015 21:17:00
Problema Stramosi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.97 kb
#include<fstream>
#include<cmath>
#include<iostream>

using namespace std;

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

int a[20][250005],Log[250005];
int n,m;

int Pow(int n,int p)
{
    int sol=1;
    while(p){
        if(p%2)
            sol=sol*n;
        n=n*n;
        p=p/2;
    }
    return sol;
}

void BuildLog()
{
    int i;
    for(i=2;i<=n;i++)
        Log[i]=Log[i/2]+1;
}

void citire()
{
    int i;
    f>>n>>m;
    for(i=1;i<=n;i++)
        f>>a[0][i];
}

void aranjare()
{
    int i,j;
    for(i=1;i<=Log[n];i++)
        for(j=1;j<=n;j++)
            a[i][j]=a[i-1][a[i-1][j]];
}

void rez(int p,int q)
{
    int red,ance=q;
    while(p && ance){
        red=Log[p];
        ance=a[red][ance];
        p-=Pow(2,red);
    }
    g<<ance<<"\n";
}

int main()
{
    int i,p,q;
    citire();
    BuildLog();
    aranjare();
    for(i=0;i<m;i++){
        f>>q>>p;
        rez(p,q);
    }
    return 0;
}