Cod sursa(job #730589)

Utilizator BarracudaFMI-Alex Dobrin Barracuda Data 6 aprilie 2012 16:34:00
Problema Stramosi Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.85 kb
#include <cstdio>
#include <vector>

using namespace std;

#define NMAX 350050
#define MMAX 400050

int St[NMAX],viz[NMAX],Find[MMAX],n,m,i,q,p,x;
vector <int> G[NMAX],L1[NMAX],L2[NMAX];
void dfs(int nod, int niv) {
	viz[nod]=1;
	St[niv]=nod;
	for (int i=0;i<L1[nod].size(); ++i) {
		x=L1[nod][i];
		if (niv-x>0)
			Find[L2[nod][i]]=St[niv-x];
		else
			Find[L2[nod][i]]=0;
	}
	
	for (int i=0;i<G[nod].size();++i)
		if (!viz[G[nod][i]])
			dfs(G[nod][i],niv+1);
}

int main() {
	
	freopen("stramosi.in", "r", stdin);
	freopen("stramosi.out", "w", stdout);
	scanf("%d %d", &n, &m);
	for (i = 1; i <= n; i++) {
		scanf("%d", &x);
		G[x].push_back(i);
	}
	for (i = 1; i <= m; i++) {
		scanf("%d %d", &q, &p);
		L1[q].push_back(p);
		L2[q].push_back(i);
	}
	
	for (i=1;i<=n;i++)
		if (!viz[i])
			dfs(i, 1);
	
	for (i=1;i<= m;i++)
		printf("%d\n", Find[i]);
	return 0;
}