Cod sursa(job #2409207)

Utilizator AndreiDeltaBalanici Andrei Daniel AndreiDelta Data 18 aprilie 2019 19:47:33
Problema Stramosi Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.64 kb
#include <bits/stdc++.h>
#define Dim 250006
using namespace std;
ifstream f("stramosi.in");
ofstream g("stramosi.out");
int N,M,a,b,root,Cont[Dim],maxim,cnt;
int P,Q,Deep[Dim];
bool ok,viz[Dim],viz2[Dim];

vector < int > V[Dim];
set < pair<int,int> > S[Dim];
set < pair<int,int> > ::iterator it;

void DFS(int nod)
{
    viz[nod]=1;
    maxim++;
    Cont[nod]=maxim;
    for(unsigned int i=0;i<V[nod].size();i++)
    {
        int vecin=V[nod][i];
        if(!viz[vecin]) DFS(vecin);
    }
}

void BFS(int nod)
{
    queue < pair<int,int> > qu;
    viz2[nod]=1;
    qu.push({nod,1});
    S[1].insert({Cont[nod],nod});
    Deep[nod]=1;
    while(!qu.empty())
    {
        int vertex=qu.front().first;
        int niv=qu.front().second+1;
        viz2[vertex]=1;
        qu.pop();
        for(unsigned int i=0;i<V[vertex].size();i++)
        {
            int vecin=V[vertex][i];
            if(!viz2[vecin])
            {
                viz2[vecin]=1;
                Deep[vecin]=niv;
                S[niv].insert({Cont[vecin],vecin});
                qu.push({vecin,niv});
            }
        }
    }
}

int main()
{
    f>>N>>M;
    for(int i=1;i<=N;i++)
    {
        f>>a;
        V[a].push_back(i);
        if(!a) ok=1;
    }
    if(!ok) root=1;
    DFS(root);
    BFS(root);
    for(int i=1;i<=M;i++)  // Q-nod
    {
        f>>Q>>P;
        if(Deep[Q]-P<=0) g<<0<<'\n';
        else
        {
            int level=Deep[Q]-P;
            int ID=Cont[Q];
            it=S[level].lower_bound({ID,level});
            it--;
            g<<(it->second)<<'\n';
        }
    }
    return 0;
}