Cod sursa(job #2158326)

Utilizator Constantin.Dragancea Constantin Constantin. Data 10 martie 2018 12:03:09
Problema Stramosi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.91 kb
#include <bits/stdc++.h>
using namespace std;

//al 2^k - lea stramos a fiecarui nod;
int n, m, p, q, dp[30][250010], pr[250010];

//preprocesare
void build(){
    int lmax = log2(n);
    //for (int i=1; i<=n; i++) dp[0][i] = i;
    for (int put = 1; put<=lmax; put++){
        for (int i=1; i<=n; i++){
            dp[put][i] = dp[put-1][dp[put-1][i]]; //al 2^(k-1) -lea stramos al 2^(k-1) -lea stramos;
        }
    }
}

int get(int nod, int dist){
    if (!dist) return nod;
    int put = 0;
    while ( (1 << (put + 1)) <= dist) put++;
    return get(dp[put][nod], dist - (1<<put));
}

int main(){
    ios_base::sync_with_stdio(0); cin.tie(0);
    ifstream cin ("stramosi.in");
    ofstream cout ("stramosi.out");
    cin >> n >> m;
    for (int i=1; i<=n; i++) cin >> dp[0][i];
    build();
    while (m--){
        cin >> q >> p;
        cout << get(q, p) << "\n";
    }
    return 0;
}