Cod sursa(job #3233842)

Utilizator PVDoriginalPopescu Vladut Daniel PVDoriginal Data 5 iunie 2024 07:23:28
Problema Stramosi Scor 50
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.47 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){
        int j = 0;
        while((1 << (j+1)) <= p && j+1 < ancestors[0].size()) j++;
        int ans = ancestors[i][j];
        int left = (1 << j);

        if(ans == -1) return 0;

        while(left < p && ans != 0) ans = parents[ans], cout << ans << "\n", left++;

        if(left != p) return 0;
        if(ans == -1) return 0;
        return ans;
    }

    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";
        }

    }