Cod sursa(job #3233843)

Utilizator PVDoriginalPopescu Vladut Daniel PVDoriginal Data 5 iunie 2024 07:28:20
Problema Stramosi Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.33 kb
#include <bits/stdc++.h>
using namespace std;

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

    int n, m;
    vector<int> parents;
    vector<vector<int>> ancestors;

    void calc(){

        for(int j = 1; j < ancestors[0].size(); j++){
            for(int i = 1; i <= n; i++){
                if(ancestors[i][j-1] != -1)
                    ancestors[i][j] = ancestors[ancestors[i][j-1]][j-1];
            }
        }

    }

    int nth_ancestor(int i, int p){
        if(p == 0) return i;

        int j = 0;
        while((1 << (j+1)) <= p && j+1 < ancestors[0].size()) j++;
        if(ancestors[i][j] == -1) return 0;

        return nth_ancestor(ancestors[i][j], p - (1 << (j)));
    }

    int main(){

        fin >> n >> m;
        parents.resize(n+1);
        ancestors.resize(n+1, vector<int>(log2(n)+1, -1));
        for(int i = 1; i <= n; i++)
            fin >> parents[i], ancestors[i][0] = parents[i];

        ancestors[0][0] = -1;
        calc();

        /*for(int i = 1; i < ancestors.size(); i++){
            cout << i << ": ";
            for(auto x : ancestors[i])
                cout << x << " ";
            cout << "\n";
        }*/

        while(m--){
            int x, y; fin >> x >> y;
            fout << nth_ancestor(x, y) << "\n";
        }

    }