Cod sursa(job #2072675)

Utilizator WebDesignbyTMGhiorghiu Ioan-Viorel WebDesignbyTM Data 22 noiembrie 2017 06:41:29
Problema Stramosi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.44 kb
#define DM 250001
#include <algorithm>
#include <fstream>
#include <queue>
#include <vector>
using namespace std;

ifstream fi ("stramosi.in");
ofstream fo ("stramosi.out");
int n, m, aux, cnt, o, w, s[DM], ord[DM], srt[DM];//s - stramosi; ord - ordinul fiecarui nod; srt - sirul sortat; cnt - nr de frunze introduse aka coloana pe care bag elemente
pair <int, int> crsp[DM];//corespondenta in matricea de stramosi
queue <int> q;//toate componentele conexe
vector <int> v[DM], p[DM];//v - muchiile; p - matricea de parinti

bool cmp(int a, int b)
{
	if (ord[a] != ord[b])
		return ord[a] > ord[b];
	else
		return a > b;
}

void dfs(int nod, int gr)
{
	for (int i = 0; i < v[nod].size(); ++i)
	{
		ord[v[nod][i]] = gr + 1;
		dfs(v[nod][i], gr + 1);
	}
}

void stramosi(int frunza)
{
	aux = frunza;
	while (aux)
	{
		p[ord[aux]].push_back(aux);
		if (crsp[aux] == make_pair(0, 0))
			crsp[aux] = {ord[aux], cnt};
		aux = s[aux];
	}
}

int main()
{
	fi >> n >> m;
	for (int i = 1; i <= n; ++i)
	{
		srt[i] = i;
		fi >> s[i];
		if (s[i])
			v[s[i]].push_back(i);
		else
			q.push(i);
	}
	while (!q.empty())
	{
		ord[q.front()] = 1;
		dfs(q.front(), 1);
		q.pop();
	}
	sort(srt + 1, srt + 1 + n, cmp);
	for (int i = 1; i <= n; ++i)
		if (crsp[srt[i]] == make_pair(0, 0))
		{
			stramosi(srt[i]);
			++cnt;
		}
	for (int i = 1; i <= m; ++i)
	{
		fi >> o >> w;
		if (w >= crsp[o].first)
			fo << 0 << '\n';
		else
			fo << p[crsp[o].first-w][crsp[o].second] << '\n';
	}
	return 0;
}