Cod sursa(job #3297882)

Utilizator alexscanteieScanteie Alexandru alexscanteie Data 24 mai 2025 00:26:02
Problema Stramosi Scor 90
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.29 kb
// complexitate O(N * log(N)) pentru precalculare
// complexitate O(log(N)) pentru fiecare interogare
#include <iostream>
#include <fstream>
#include <vector>
#include <cmath>

using namespace std;

const int MAXN = 250005;
const int LOG = 19;

int up[MAXN][LOG]; 

// up[node][j] = al 2**j-lea strămoș al node-ului
// up[5][0] = strămoșul direct 
// up[5][1] = strămoșul la 2 pași
// up[5][2] = strămoșul la 4 pași
// ......

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

    int N, M;
    fin >> N >> M;

    for (int i = 1; i <= N; i++) {
        fin >> up[i][0]; // părintele direct
    }

    // Precalculare pentru fiecare 2^j
    for (int j = 1; j < LOG; j++) {
        for (int i = 1; i <= N; i++) {
            if (up[i][j - 1] != 0)
                up[i][j] = up[up[i][j - 1]][j - 1];
            else
                up[i][j] = 0;
        }
    }

    for (int i = 0; i < M; i++) {
        int node, p;
        fin >> node >> p;
        // p in binar si sarim prin bitii de 1, daca bitul i e setat, sarim 2^i pasi in sus
        for (int j = 0; j < LOG; j++) {
            if (p & (1 << j)) {
                node = up[node][j];
                if (node == 0)
                    break;
            }
        }
        fout << node << '\n';
    }

    return 0;
}