Cod sursa(job #2589699)

Utilizator mirceamaierean41Mircea Maierean mirceamaierean41 Data 26 martie 2020 18:50:30
Problema Stramosi Scor 80
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.69 kb
#include <fstream>
#include <map>
#include <vector>
#include <bitset>
#pragma warning(disable:4996)
#define x first
#define y second
using namespace std;

class InParser
{
private:
	FILE* fin;
	char* buff;
	int sp;
	char read()
	{
		++sp;
		if (sp == 4096)
		{
			sp = 0;
			fread(buff, 1, 4096, fin);
		}
		return buff[sp];
	}
public:
	InParser(const char* nume)
	{
		sp = 4095;
		fin = fopen(nume, "r");
		buff = new char[4096];
	}
	InParser& operator >> (int& n)
	{
		char c;
		while (!isdigit(c = read()));
		n = c - '0';
		while (isdigit(c = read()))
			n = n * 10 + c - '0';
		return *this;
	}
};

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

const int NMAX = 250003;

typedef pair <int, int> p;

vector <int> g[NMAX];
vector <int> q[NMAX];
vector <int> rad;
map<p, int> r;
vector <p> query;
int n, m, a, b;
vector <int> st;

void DFS(int nod)
{
	st.push_back(nod);
	for (size_t i = 0; i < g[nod].size(); ++i)
	{
		int fiu = g[nod][i];
		for (size_t j = 0; j < q[fiu].size(); ++j)
		{
			int str = q[fiu][j];
			if (str == 0) r.insert({ {fiu, str}, fiu });
			else if (str <= st.size())
				r.insert({ {fiu, str}, st[st.size() - str] });
			else r.insert({ {fiu, str}, 0 });
		}
		DFS(fiu);
	}
	st.pop_back();
}

int main()
{
	fin >> n >> m;
	for (int i = 1; i <= n; ++i)
	{
		fin >> a;
		if (a == 0) rad.push_back(i);
		else g[a].push_back(i);
	}

	query.resize(m);

	for (int i = 0; i < m; ++i)
	{
		fin >> query[i].x >> query[i].y;
		q[query[i].x].push_back(query[i].y);
	}

	for (size_t i = 0; i < rad.size(); ++i)
		DFS(rad[i]);

	for (int i = 0; i < m; ++i)
		fout << r[query[i]] << "\n";
	return 0;
}