Cod sursa(job #424594)

Utilizator Addy.Adrian Draghici Addy. Data 24 martie 2010 22:45:41
Problema Stramosi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.98 kb
#include <cstdio>
#include <vector>

using namespace std;

#define NMAX 250050
#define MMAX 300050
#define LMAX 20

int S[NMAX], viz[NMAX], sol[MMAX], n, m, i, x, y;
vector <int> A[NMAX], list[NMAX], listp[NMAX];

void DFS(int nod, int lev) {
	int i;
	
	viz[nod] = 1, S[lev] = nod;
	
	for (i = 0; i < list[nod].size(); i++) {
		x = list[nod][i];
		if (lev - x > 0)
			sol[listp[nod][i]] = S[lev - x];
		else
			sol[listp[nod][i]] = 0;
	}
	
	for (i = 0; i < A[nod].size(); i++)
		if (!viz[A[nod][i]])
			DFS(A[nod][i], lev + 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);
		A[x].push_back(i);
	}
	
	for (i = 1; i <= m; i++) {
		scanf("%d %d", &x, &y);
		list[x].push_back(y);
		listp[x].push_back(i);
	}
	
	for (i = 1; i <= n; i++)
		if (!viz[i])
			DFS(i, 1);
	
	for (i = 1; i <= m; i++)
		printf("%d\n", sol[i]);
	
	return 0;
}