Cod sursa(job #391872)

Utilizator mathboyDragos-Alin Rotaru mathboy Data 6 februarie 2010 13:45:31
Problema Stramosi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.37 kb
#include <fstream>
#include <vector>
#include <bitset>
#define maxm 1<<19
#define maxn 230000
#define pb push_back
#define sz size

using namespace std;

ifstream fin ("stramosi.in");
ofstream fout ("stramosi.out");

struct stiva { int nod, level; };
stiva stf [maxm];
int N, M, i, p, q , a, cap, node, lev;
int st [maxm];
vector <int> listv [maxm];
vector <int> listp [maxm], G [maxm];
int sol [maxm], fat [maxm];
bool viz [maxm];

void dfs () {
    //diz iz da sou
	int j;
	while (1) {
	node = stf [cap].nod;
	lev = stf [cap].level;
	//for (j = 1; j <= cap; j++) fout << stf [j].nod << "\n";
	viz [node] = true;
    st [lev] = node;
	if (!cap) return;
	else --cap ;
	
	for (j = 0; j < listv [node].sz (); j++) 
		    if (lev > listv [node][j]) sol [listp [node][j]] = st [lev - listv [node][j]];
	for (j = 0; j < G [node].sz (); j++) 
		if (!viz [G [node][j]]) {
			++cap;
			stf [cap].nod = G [node][j];
			stf [cap].level = lev + 1;
		}
	}
}

int main () {
	
	int a;
	fin >> N >> M;
	for (i = 1; i <= N; i++) {
		fin >> a;
		fat [i] = a;
		G [a].pb (i);
	}
    for (i = 1; i <= M; i++) 
	{
		fin >> q >> p;
		listv [q].pb (p);
		listp [q].pb (i);
	}
	for (i = 1; i <= N; i++)
		if (!fat [i]) {
			cap = 1;
			stf [cap].level = 1;
			stf [cap].nod = i;
			dfs ();
		}
	for (i = 1; i <= M; i++) fout << sol [i] << "\n";
	return 0;
}