Cod sursa(job #859256)

Utilizator romircea2010FMI Trifan Mircea Mihai romircea2010 Data 19 ianuarie 2013 22:43:42
Problema Stramosi Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.07 kb
#include <iostream>
#include <fstream>
#include <cstdio>
#include <vector>
#include <algorithm>

using namespace std;

int n, m, hmax, H[250010], put[35], k;
char ch[10000000];
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++)
        if (tata[i] == 0)
            DFS(i);
    for(i=1; i<=n; i++)
        a[0][i] = tata[i];
    int p = 1;
    for(k=1; p<=hmax; k++)
        p=p*2;
    //cout<<p<<" "<<k;
    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;

//    cout<<hmax<<"\n";
//    for(i=0; i<=k; i++)
//    {
//        for(j=1; j<=n; j++)
//            cout<<a[i][j]<<" ";
//        cout<<"\n";
//    }
}

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
    q = a[i][q];
    p = p-put[i];
    return Stramos(q, p);
}

inline void Solve()
{
    ifstream f("stramosi.in");
    ofstream g("stramosi.out");
    f>>n>>m;
    f.get();
    f.getline(ch, 10000000);
    int i, nr, nrnod;
    i = 0;
    nrnod = 1;
    while(ch[i])
    {
        nr = 0;
        while(ch[i]!=' ' && ch[i])
            nr = nr*10 + (ch[i] - '0'), i++;
        tata[nrnod] = nr;
        if (tata[nrnod]!=0)
            G[tata[nrnod]].push_back(i);
        nrnod++;
        while(ch[i] && ch[i] == ' ')
            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;
}