Cod sursa(job #2754194)

Utilizator ChelaruPaulChelaru Paul ChelaruPaul Data 25 mai 2021 13:35:08
Problema Stramosi Scor 90
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.13 kb
#include<fstream>
#include <iostream>
#include <vector>

#define ll long long
using namespace std;
ifstream fin("stramosi.in");
ofstream fout("stramosi.out");
int log2[200010], nrNoduri, nrQuery, tree[21][200010];

void logaritm() {
    log2[1] = 0;
    for (int i = 2; i <= nrNoduri; i++)
        log2[i] = log2[i / 2] + 1;
}

void construireTree() {
    for (int i = 1; i <= nrNoduri; i++)
        fin >> tree[0][i];

    //u[i][nod] -> iˆ2-th stramos a lui nod
    for (int nod = 1; nod <= nrNoduri; nod++)
        for (int i = 1; (1 << i) <= nrNoduri; i++)
            tree[i][nod] = tree[i - 1][tree[i - 1][nod]]; //parintele parintelui
}

int query(int nod, int kStramos) {
    while (kStramos > 0) {
        int linie = log2[kStramos];
        nod = tree[linie][nod];
        kStramos -= (1 << log2[kStramos]); //drumul catre stramos se ia pe bucati si se scade din total
    }
    return nod;
}

int main() {
    fin >> nrNoduri >> nrQuery;
    logaritm();
    construireTree();

    int nod, kStramos;
    for (int i = 1; i <= nrQuery; i++) {
        fin >> nod >> kStramos;
        fout << query(nod, kStramos) << '\n';
    }

    return 0;
}