Cod sursa(job #1426691)

Utilizator RaileanuCristian Raileanu Raileanu Data 30 aprilie 2015 12:21:14
Problema Stramosi Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.53 kb
#include <fstream>
#include <list>
#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] ;
list<int> graf[MX];
bool viz[MX];

struct stack_node
{
    int nod;
    list<int>::iterator 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= graf[nod].begin();
        else st[k].it++;

        viz[nod]= true;

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

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

}

int query(int nod, int p)
{
    if ( p > (1<<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;
        graf[v].push_back(i);
    }

    DFS();

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

    f2.close();
    return 0;
}