Cod sursa(job #2505262)

Utilizator mitza23Mihai Grebla mitza23 Data 6 decembrie 2019 16:50:16
Problema Stramosi Scor 80
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.51 kb
#include <fstream>
#include <vector>

using namespace std;

ifstream fi("stramosi.in");
ofstream fo("stramosi.out");

int N,Q;
vector <int> D[250001];
int P[250001];
int LEVEL[250001];
int table[250001][20];

void df(int vf, int level)
{
    LEVEL[vf]=level;

    vector <int> :: iterator it;
    for(it = D[vf].begin();it != D[vf].end();it++)
    {
        df(*it, level+1);
    }
}



int walk(int vf, int dist)
{///returneaza stramosul lui vf situat la departare dist, 0 daca nu exista

    if(LEVEL[vf]<=dist)
        return 0;
    for(int p=18;p>=0;p--){
        if((1<<p)<=dist){
            vf = table[vf][p];
            dist -= (1<<p);
        }
    }

    return vf;

}

int main()
{
    fi>>N>>Q;

    for(int i=1;i<=N;i++)
    {
        fi>>P[i];
        D[P[i]].push_back(i);
    }

    /// se determina adancimea pentru fiecare vf
    for(int i=1;i<=N;i++)
    {
        if(P[i]==0)
            df(i,1);
    }



    ///se construieste matricea table
    ///table[v][d] = stramosul lui v situat la departare 2^d

    for(int i=1;i<=N;i++)
    {
        table[i][0]=P[i];
    }

    for(int c=1;c<=18;c++)
        for(int v=1;v<=N;v++)
        {
            if((1<<c)>LEVEL[v])
                table[v][c]=0;
            else
                table[v][c]=table[table[v][c-1]][c-1];
        }

    for(int q=1;q<=Q;q++)
    {
        int v,d;
        fi>>v>>d;
        fo<<walk(v,d)<<'\n';
    }

    fi.close();
    fo.close();
    return 0;
}