Cod sursa(job #2939887)

Utilizator TudosieRazvanTudosie Marius-Razvan TudosieRazvan Data 14 noiembrie 2022 12:54:14
Problema Stramosi Scor 60
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.12 kb
#include <fstream>
#include <cmath>
#include <algorithm>
#define NMAX 250001
using namespace std;

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

int n,q;
int dp[NMAX][501];



int stramos(int nod,int nrS)
{
    //practic vad ce putere a lui 2 apare in nrS si ma duc acolo
    //descompun numarul nrS in sume de puteri de 2(in baza 2)
    int rez=nod;
    for(int i=18; i>=0; i--)
    {
        if(nrS>=(1<<i))
        {
            nrS-=(1<<i);
            rez=dp[rez][i];//ma duc in stramosul 2^i al nodului rezultat
        }
    }
    return rez;
}

int main()
{
    fin>>n>>q;
    for(int i=1; i<=n; i++)
    {
        fin>>dp[i][0];
    }

    for(int k=1; (1<<k)<=n; k++)
    {
        //calculez al k vecin al nodului
        for(int i=1; i<=n; i++)
        {
            dp[i][k]=dp[dp[i][k-1]][k-1];
            //practic este stramosul 2^(k-1) al stramosului 2^(k-1) din i
            //ca 2^(k-1)+2^(k-1)=2^k
        }
    }

    for(int i=1; i<=q; i++)
    {
        int nod,nrS;
        fin>>nod>>nrS;
        fout<<stramos(nod,nrS)<<"\n";
    }
    return 0;
}