Cod sursa(job #2753798)

Utilizator Virgil993Virgil Turcu Virgil993 Data 24 mai 2021 14:23:17
Problema Stramosi Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.52 kb
#include<bits/stdc++.h>
using namespace std;

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

int n, m;
int a[20][250003]; //stramos[2^i][j]-->stramosul de ordin 2^i a elem de pe j
//RMQ



void initializare()
{

    int i, j, p;
      for(i = 1, p = 2; p <= n; ++i, p *= 2)//p--> nu are rost sa cautam mai multi parinti decat sunt in total noduri
        for(j = 1; j <= n; ++j)
        a[i][j] = a[i-1][a[i-1][j]];//stramosul de ordin p pt un elem este stramos de oridn p/2 pt stramos de oridn p/2



}
int calc(int poz, int nr) //al nr lea stramos pt elem pe poz poz
{
    int pow, i, aux;
    aux = poz;//plec de unde mi-a dat si vad unde ajung
              //ca sa stim pentru ce elem facem ierarhia
    while(nr != 0)//cat inca n am gasit stramosul
    {
        //mergem din puteri de a lui 2 cat de mult putem --> cautam cea mai apropiata de nr
        pow = 1;
        i = 0;
        while(pow * 2 <= nr)
        {
            pow *= 2;
            i++;
        }
        aux = a[i][aux]; //devine noul copil pt care cautam stramosii
                        //copilul de orind 2^i pt aux;
        nr -= pow;//de cati stramosi am scapat
    }
    return aux;
}



int main()

{

    int x, y, i, j;
    fin >> n >> m;
    for(j = 1; j <= n; ++j)
        fin>>a[0][j]; //primii stramosi(prima lin din matrice)
    initializare();
    for( i = 1; i <= m; ++i)
    {
        fin >> x >> y; //al y lea stramos pt elem pe poz x
        fout << calc(x, y) << "\n";
    }



}