Cod sursa(job #2909133)

Utilizator AACthAirinei Andrei Cristian AACth Data 9 iunie 2022 16:37:16
Problema Stramosi Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.24 kb
#include <bits/stdc++.h>
using namespace std;
ifstream f("stramosi.in");
ofstream g("stramosi.out");
#define cin f
#define cout g
// #define int long long
const int Max = 3e5 + 1;
void nos()
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
}
int n,q;
int father[Max];
vector < int > v[Max];
void read()
{
	f>>n>>q;
	int i;
	for(i=1;i<=n;i++){
		int x;
		f>>x;
		father[i] = x;
		v[x].push_back(i);
	}
}
vector < pair < int , int > > queries[Max];
int ans[Max];
vector < int > path;
void dfs(int nod){
	path.push_back(nod);
	for(auto que : queries[nod]){
		int len = que.second;
		int id = que.first;
		int lungime = path.size();
		if(lungime - 1 - len >= 0)
			ans[id] = path[lungime - 1 - len];
		else ans[id] = 0;
	}
	for(auto ch : v[nod])
		dfs(ch);
	path.pop_back();
}

void solve()
{
	int i;
	// ans.resize(q);
	for(i=0;i<q;i++){
		int p,nod;
		f>>nod>>p;
		queries[nod].push_back({i,p});
	}    
	for(i=1;i<=n;i++)
		if(father[i] == 0)
			dfs(i);
	for(int i = 0;i<q;i++)
		cout<<ans[i]<<'\n';
}
void restart()
{

}
int32_t main()
{
    nos();
    // int teste;
    // f>>teste;
    // while(teste--)
    {
        read();
        solve();
        restart();
    }
    return 0;
}