Cod sursa(job #2614377)

Utilizator marius135Dumitran Adrian Marius marius135 Data 11 mai 2020 17:45:54
Problema Stramosi Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.01 kb
#include <iostream>

using namespace std;

#define maxn 250001
int tata[maxn][20];

// urcam cu puteri a lui 2 strict mai mici ca k
// practic daca k = 7 urcam 4 apoi 2 apoi 1
int solve(const int& nod, const int& k) {
    int k_actual = k;
    int div_nivel = (1<<20);
    int rez = nod;
    for (int putere = 20; putere >= 0; putere--, div_nivel/=2) {
        if (div_nivel <= k) {
            rez = tata[rez][putere];
            k_acutal -= div_nivel;
        }
    }
    return rez;
}

int main()
{

    freopen("stramosi.in","r",stdin);
    freopen("stramosi.out","w",stdout);

    scanf("%d %d", &n, &m);
    for (int i = 1; i <= n; ++i) {
        scanf("%d", &tata[i][0]);
    }
    int putere = 2;
    for (int j = 1; putere < n; ++j, putere *= 2) {
        for (j = 1; j <= n; ++j) {
            tata[j][i] = tata[tata[j][i-1]][i-1];//stramosul meu va fi tatal tatalui meu
        }
    }
    for (int i = 0; i < m; ++i) {
        int nod, k;
        scanf("%d %d", &nod, &k);
        solve(nod, k);
    }

    return 0;
}