Cod sursa(job #859267)

Utilizator romircea2010FMI Trifan Mircea Mihai romircea2010 Data 19 ianuarie 2013 23:00:41
Problema Stramosi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.48 kb
#include <iostream>
#include <fstream>
#include <cstdio>
#include <vector>
#include <algorithm>

using namespace std;

int n, m, hmax, H[250010], put[35], k;
int a[20][250010];
int tata[250010];
vector <int> G[250010];

inline void DFS(int x)
{
    vector <int>::iterator it;
    for(it=G[x].begin(); it!=G[x].end(); it++)
    {
        DFS(*it);
        H[*it] = H[x] + 1;
        hmax = max(hmax, H[*it]);
    }
}

inline void Calc()
{
    int i, j;
    for(i=1; i<=n; i++)
        a[0][i] = tata[i];

    k = 20;
    for(i=1; i<=k; i++)
    {
        for(j=1; j<=n; j++)
            a[i][j] = a[i-1][a[i-1][j]];
    }

    put[0] = 1;
    for(i=1; i<=25; i++)
        put[i] = put[i-1]*2;

}

inline int Stramos(int q, int p)
{
    if (q == 0)
        return 0;
    if (p == 0)
        return q;
    int i;
    for(i=k; put[i] > p;i--);
    // i - exponent, put[i] - puterea
    return Stramos(a[i][q], p-put[i]);
}

inline void Solve()
{
    ifstream f("stramosi.in");
    ofstream g("stramosi.out");
    int i;
    f>>n>>m;
    for(i=1; i<=n; i++)
    {
        f>>tata[i];
        if (tata[i]!=0)
            G[tata[i]].push_back(i);
    }
    Calc();
    int p, q;
    while(m)
    {
        m--;
        f>>q>>p; // care este al p-lea stramos al lui q
        if (p>n)
            g<<"0\n";
        else
            g<<Stramos(q, p)<<"\n";
    }
    f.close();
    g.close();
}

int main()
{
    Solve();
    return 0;
}