Cod sursa(job #2759015)

Utilizator PopescuAndreiAlexandruPopescu Andrei Alexandru PopescuAndreiAlexandru Data 14 iunie 2021 20:33:46
Problema Stramosi Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.52 kb
#include <iostream>
#include <fstream>
#include <algorithm>
#include <vector>
#include <map>
#include <queue>

using namespace std;

ifstream fin("stramosi.in");
ofstream fout("stramosi.out");

const int N = 300005;

int n,m,x,y,Sol[N],List[N],k;

queue <int> Roots;

vector < pair<int,int> > Q[N];
vector <int> G[N];

bool seen[N];

void Read()
{
    fin>>n>>m;
    for(int i=1; i<=n; i++)
        {
            fin>>x;
            if(x!=0)
                G[x].push_back(i);
            else
                Roots.push(i);
        }
}

void Queries()
{
    for(int i=1; i<=m; i++)
        {
            fin>>x>>y;
            Q[x].push_back(make_pair(y,i));
        }
}

void DFS(int node)
{
    List[++k]=node;

    for(vector < pair<int,int> > ::iterator it=Q[node].begin(); it!=Q[node].end(); it++)
        {
            int ancestor=(*it).first;
            if(k-ancestor>=1)
                Sol[(*it).second]=List[k-ancestor];
        }

    seen[node]=true;
    for(vector <int> ::iterator it=G[node].begin(); it!=G[node].end(); it++)
        {
            int next=(*it);
            if(!seen[next])
                DFS(next);
        }

    k--;
}

void Solve()
{
    while(!Roots.empty())
        {
            int crt=Roots.front();
            k=0;
            DFS(crt);
            Roots.pop();
        }
}

void Print()
{
    for(int i=1; i<=m; i++)
        fout<<Sol[i]<<'\n';
}

int main()
{
    Read();
    Queries();
    Solve();
    Print();
}