Cod sursa(job #928362)

Utilizator vld7Campeanu Vlad vld7 Data 26 martie 2013 13:41:25
Problema Stramosi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.19 kb
#include <fstream>
#include <iostream>
#include <vector>

using namespace std;

ifstream f("stramosi.in");
ofstream g("stramosi.out");

const int MAX_N = 250005;

int n, m, tata[MAX_N], nivel[MAX_N], where[MAX_N];
bool frunza[MAX_N];
vector <int> stramos[MAX_N];	// stramos[i] = lista de stramosi a frunzei i

void read() {
	f >> n >> m;
	for (int i = 1; i <= n; i++)
		frunza[i] = 1;
	
	for (int i = 1; i <= n; i++) {
		f >> tata[i];
		frunza[tata[i]] = 0;
	}
}

void baga(int frunza) {
	int nod = frunza;
	while (tata[nod] != 0) {
		stramos[frunza].push_back(tata[nod]);
		where[nod] = frunza;
		nivel[tata[nod]] = nivel[nod] + 1;
		nod = tata[nod];
	}
	where[nod] = frunza;
}

void precompute() {
	for (int i = 1; i <= n; i++)
		if (frunza[i])
			baga(i);
}

void solve() {
	for (int i = 1; i <= m; i++) {
		int Q, P;
		
		f >> Q >> P;
		int frnz = where[Q];
		
		if (P == 0)
			g << Q << '\n';
		else if (P + nivel[Q] - nivel[frnz] - 1 >= stramos[frnz].size())
			g << 0 << '\n';
		else
			g << stramos[frnz][P + nivel[Q] - nivel[frnz] - 1] << '\n';
	}
}

int main() {
	read();
	precompute();
	solve();
	
	f.close();
	g.close();
	
	return 0;
}