Cod sursa(job #1743261)

Utilizator oldatlantianSerban Cercelescu oldatlantian Data 17 august 2016 20:47:18
Problema Stramosi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.87 kb
#include <bits/stdc++.h>
using namespace std;

const int NMAX = 250005,
           LGN = 20;

int anc[NMAX],
     dp[LGN][NMAX];

inline int anc_q(int q, int p) {
    int e = 0;

    while(q!=0 && p>0) {
        if(p&1)
            q = dp[e][q];

        p>>=1;
        ++e;
    }

    return q;
}

int main(void) {
    freopen("stramosi.in",  "r", stdin);
    freopen("stramosi.out", "w", stdout);
    int n, m, q, p;

    scanf("%d%d",&n,&m);
    for(int i=1; i<=n; ++i)
        scanf("%d",&anc[i]);

    for(int i=1; i<=n;  ++i)
        dp[0][i] = anc[i];

    for(int e=1; e<LGN; ++e)
        for(int i=1; i<=n; ++i)
            dp[e][i] = dp[e-1][dp[e-1][i]];

    while(m--) {
        scanf("%d%d",&q,&p);

        (p>n) ? (printf("0\n")) : (printf("%d\n",anc_q(q, p)));
    }

    fclose(stdin);
    fclose(stdout);
    return 0;
}