Cod sursa(job #957709)

Utilizator dunhillLotus Plant dunhill Data 5 iunie 2013 20:05:34
Problema Stramosi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.26 kb
#include <cstdio>
#include <vector>
#define MAXN 300001
using namespace std;

int i, N, M, Q, P, Head, a, n;
int st[MAXN], Answer[MAXN];
struct nod {int QA, position;}var, now;
vector <int> v[MAXN], start;
vector <nod> p[MAXN];
bool used[MAXN];

inline void DFS(int node) {
	used[node] = true;
	st[++Head] = node;
	if (p[node].size() != 0) {
		for (i = 0; i < p[node].size(); ++i) {
			now.position = p[node][i].position;
			if (Head - p[node][i].QA <= 0) now.QA = 0;
			else 
				now.QA = st[Head - p[node][i].QA];
			Answer[now.position] = now.QA;
		}
	}
	vector <int> :: iterator it, fin;
	it = v[node].begin(); fin = v[node].end();
	for (; it != fin; ++it) 
		if (!used[*it]) 
			DFS(*it);
	--Head;
}
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", &a);
		if (a == 0) start.push_back(i);
		else {
			v[a].push_back(i);
			v[i].push_back(a);
		}
	}
	for (; M > 0; --M) {
		scanf("%d%d", &Q, &P);
		var.QA = P; var.position = ++n;
		p[Q].push_back(var);
	}
	vector <int> :: iterator f;
	for (f = start.begin(); f != start.end(); ++f)
		if (!used[*f]) 
			DFS(*f);
	for (i = 1; i <= n; ++i)
		printf("%d\n", Answer[i]);
	return 0;
}