Cod sursa(job #2753169)

Utilizator DianaIfrosaIfrosa Diana DianaIfrosa Data 21 mai 2021 12:41:53
Problema Stramosi Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.41 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 2^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,temp,index;

    temp=poz; //plec de la pozitia data

    //simulez scrierea in baza 2 pentru numarul de stramosi pe care trebuie sa l parcurg

    while(nrstram!=0)
    {
        powmax=1, 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][temp]; //valoare temporara

        nrstram-=powmax; //scad cati am putut sa parcurg

    }

    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;
}