Cod sursa(job #2752404)

Utilizator DianaIfrosaIfrosa Diana DianaIfrosa Data 17 mai 2021 21:15:32
Problema Stramosi Scor 80
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.27 kb
#include <iostream>
#include <fstream>

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

int n,m;
int stramosi[20][250003];

void Prep()
{
    //stramosi[i][j]= stramosul de ordin i al elementului de pe poz j

    for(int i=1, range=2; range<=n; ++i, range*=2) //range=2^i
        for(int j=1; j<=n; ++j)
            //stramosul de ordin P al unui element X este stramosul de ordin P/2 al stramosului de ordin P/2 al lui X
            stramosi[i][j]=stramosi[i-1][stramosi[i-1][j]];

}

int stramos(int poz, int nrstram)
{
    int powmax=1, temp, index=0;

    //caut cea mai mare putere a lui 2 mai mica sau egala decat nrstram
    while(powmax*2<=nrstram)
        powmax*=2,index ++;

    temp=stramosi[index][poz]; //valoare temporara

    while(powmax<nrstram) // pe restul ii parcurg din 1 in 1
    {
        temp=stramosi[0][temp];
        powmax++;
    }

    return temp;

}

int main()
{
    int q,p;
    fin>>n>>m;

    for(int j=1; j<=n; ++j)
        fin>>stramosi[0][j]; //prima linie e vectorul de stramosi

    Prep(); //preprocesare

    for(int i=1; i<=m; ++i)
    {
        fin>>q>>p; //al p lea stramos al numarul de pe pozitia q
        fout<<stramos(q,p)<<"\n";
    }

    return 0;
}