Cod sursa(job #3196800)

Utilizator AndyGooShooterDurlea Andrei AndyGooShooter Data 24 ianuarie 2024 20:17:12
Problema Stramosi Scor 90
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.33 kb
// https://www.infoarena.ro/problema/stramosi

#include <iostream>
#include <fstream>
#include <vector>
#include <cmath>
using namespace std;

int table[250001][20];
int parent[250001];
vector<int> adj[250001];

void DFS(int source){
    cerr << source << ' ';
    for(auto i : adj[source]){

        table[i][0] = source;
        for(int k = 1; k < 20; k ++)
            table[i][k] = table[table[i][k - 1]][k - 1];

        DFS(i);
    }
}

int query(int p, int q){

    // cerr << p << ' ' << q << '\n';
    
    if(p == 0)
        return 0;

    if(q == 0)
        return p;

    int k = log2(q);
    return query(table[p][k], q - (1 << k));
}

// ifstream fin("input.txt");
// ofstream fout("output.txt");


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

int main(){


    int n, q, P, Q, val;
    fin >> n >> q;

    for(int i = 1; i <= n; i ++){
        fin >> val;

        adj[val].push_back(i);
        parent[i] = val;
    }

    // BUILD
    for(int i = 1; i <= n; i ++)
        if(!parent[i])
            DFS(i);

    for(int i = 1; i <= q; i ++){
        fin >> P >> Q;
        fout << query(P, Q) << '\n';
    }

    // for(int i = 1; i <= n; i ++)
    //     for(int j = 0; j <= 3; j ++)
    //         cerr << table[i][j] << " \n"[j == 3];

    return 0;
}