Cod sursa(job #1427000)

Utilizator RaileanuCristian Raileanu Raileanu Data 1 mai 2015 11:54:12
Problema Stramosi Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.64 kb
#include <fstream>
#include <string.h>
using namespace std;
ifstream f1("stramosi.in");
ofstream f2("stramosi.out");
#define MX 250010

int n,m, str[MX][20], nr_stram[MX], val[MX], next[MX], first[MX], last[MX], nrn ;
bool viz[MX];

void add_edge(int x, int y)
{
    if ( !first[x] )
        first[x]= nrn+1;

    next[ last[x] ]= ++nrn;
    val[nrn]= y;
    last[x]= nrn;
}

struct stack_node
{
    int nod, it;
};

stack_node st[MX];

void DFS()  // iterativ
{
    int nod, i, k=0;

    st[++k].nod= 0;

    while (k)
    {
        nod= st[k].nod;

        if ( !viz[nod] )
            st[k].it= first[ nod ];
        else st[k].it= next[ st[k].it ];

        viz[nod]= true;

        // procesam informatiile despre parintii nodului daca e prima data cand se intra in el
        if ( st[k].it == first[nod] )
        {
            for (i=1; k- (1<<i) > 1; i++ )
                str[nod][i]= st[k- (1<<i) ].nod;
            nr_stram[ nod ]= k-2;
        }

        if ( st[k].it )
        {
            st[k+1].nod= st[k].it;
            k++;
        }
        else k--;
    }

}

int query(int nod, int p)
{
    if ( p > nr_stram[ nod ] )
        return 0;

    if ( p == 0)
        return nod;

    int i=0;
    while ( (1<<(i+1)) <= p )
        i++;

    return query( str[nod][i], p- (1<<i) );
}

int main()
{
    int i, v,q,p;

    f1>>n>>m;
    for (i=1; i<=n; i++)
    {
        f1>>v;
        str[i][0]= v;
        add_edge(v,i);
    }

    DFS();

    for (i=1; i<=m; i++)
    {
        f1>>q>>p;
        f2<< query(q, p)<<"\n";
    }

    f2.close();
    return 0;
}