Cod sursa(job #2389312)

Utilizator BogdanAlexandruBogdan-Alexandru Dig BogdanAlexandru Data 26 martie 2019 23:07:03
Problema Stramosi Scor 80
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.28 kb
#include <iostream>
#include <stdio.h>
#define FOR(i,a) for((i)=0;(1<<i)<=a;++i)
using namespace std;
FILE *f,*g;
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;
void Read()
{
    int i;
    fscanf(f,"%d %d",&N,&M);
    for(i=1;i<=N;++i)fscanf(f,"%d",&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;
        fscanf(f,"%d %d",&X,&Poz);
        fprintf(g,"%d\n",Search(X,Poz));
    }
}
int main()
{
    f=fopen("stramosi.in","r");
    g=fopen("stramosi.out","w");
    Read();BuildMatrix();SolveAndDisplaying();
    fclose(f);fclose(g);
    return 0;
}