Cod sursa(job #2753367)

Utilizator MirunaStefaniaLupascu Miruna-Stefania MirunaStefania Data 22 mai 2021 17:01:47
Problema Stramosi Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.41 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(j = 1; j <=n; ++j)
        a[i][j] = a[i-1][a[i-1][j]];///stramosul de orin 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";
    }

}