Cod sursa(job #469868)

Utilizator dornescuvladVlad Eugen Dornescu dornescuvlad Data 9 iulie 2010 13:53:40
Problema Stramosi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.05 kb
#define nmax 250005
#define mmax 300005
#include <iostream> 
#include <fstream>
#include <vector>

using namespace std;

const char iname[] = "stramosi.in";
const char oname[] = "stramosi.out";

ifstream fin(iname);
ofstream fout(oname);

vector <int> A[nmax], Stramos[nmax], Query[mmax];
int i, j, x, N, M, st[nmax], viz[nmax], sol[mmax], y;

void DFS(int node, int nivel)
{	
	int i, j;
	viz[node] = 1;
	st[nivel] = node;
	for(i = 0; i < Stramos[node].size(); i ++)
	{
		if(nivel - Stramos[node][i] >= 1)
			sol[Query[node][i]] = st[nivel - Stramos[node][i]];
		else
			sol[Query[node][i]] = 0;
	}
	
	for(i = 0; i < A[node].size(); i ++)
		if(!viz[A[node][i]])
			DFS(A[node][i], nivel + 1);
}
	
int main()
{
	fin >> N >> M;
	for(i = 1; i <= N; i ++)
	{
		fin >> x;
		A[x].push_back(i);
	}
	for(i = 1; i <= M; i ++)
	{
		fin >> x >> y;
		Stramos[x].push_back(y);
		Query[x].push_back(i);
	}
	
	for(i = 1; i <= N; i ++)
		if(!viz[i])
			DFS(i, 1);
	for(i = 1; i <= M; i ++)
		fout << sol[i] << "\n";
		
	return 0;
}