Cod sursa(job #2389320)

Utilizator BogdanAlexandruBogdan-Alexandru Dig BogdanAlexandru Data 26 martie 2019 23:12:46
Problema Stramosi Scor 80
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.18 kb
#include <bits/stdc++.h>
#define FOR(i,a) for((i)=0;(1<<i)<=a;++i)
using namespace std;
int RMQ[250010][25];///RMQ[i][j]-reține al 2^j strămoș al nodului i
///folosim ideea că orice număr natural se poate scrie ca sumă de puteri distince ale lui 2, ca atare:
/// E = { 2^w + 2^t + 2^z + .... + 2^q },w,t,z,...q distincte și w < t < z < ... < q
int N,M;
ifstream f("stramosi.in");ofstream g("stramosi.out");
void Read()
{
    int i;
    f>>N>>M;
    for(i=1;i<=N;++i)f>>RMQ[i][0];
}
void BuildMatrix()///* Dynamic Programming and "Some Math For Babies :-) " by Marius Buzg
{
    int i,j,X;
    for(i=1;i<=18;++i)
        for(j=1;j<=N;++j)
        {
            RMQ[j][i]=RMQ[RMQ[j][i-1]][i-1];
        }
}
int Search(int Node,int P)
{
    int i;
    FOR(i,P)
    {
        if(P&(1<<i))/// (1<<i) aparține lui E
        {
            Node=RMQ[Node][i];
            if(!Node)return 0;
        }
    }
    return Node;
}
void SolveAndDisplaying()
{
    int X,Poz;
    while(M)
    {
        --M;
        f>>X>>Poz;
        g<<Search(X,Poz)<<"\n";
    }
}
int main()
{
    Read();BuildMatrix();SolveAndDisplaying();
    f.close();g.close();
    return 0;
}