Cod sursa(job #677371)

Utilizator Cosmin1490Balan Radu Cosmin Cosmin1490 Data 10 februarie 2012 04:00:59
Problema Stramosi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.47 kb
#include <fstream>
#include <vector>
#include <stack>

using namespace std;

#define NSIZE 250001
#define MSIZE 300001

const char* infile = "stramosi.in";
const char* outfile = "stramosi.out";

vector<int> G[NSIZE];
vector<pair<int, int> > Intrebari[NSIZE];
int Solutii[MSIZE];
bool viz[NSIZE];

vector<int> stramosi;


void DFS(int root)
{
	stack<int> stiva;

	stiva.push(root);

	while(stiva.empty() == false)
	{
		int current = stiva.top();
		if(viz[current] == true)
		{
			stiva.pop();
			stramosi.pop_back();
			continue;
		}

		viz[current] = true;
		stramosi.push_back(current);

		for(unsigned int i = 0; i < G[current].size(); ++i)
		{
			stiva.push(G[current][i]);
		}
		
		for(vector<pair<int, int> > ::iterator itr = Intrebari[current].begin();
			itr != Intrebari[current].end();
			itr++)
		{
			int P = itr->first;
			int index = itr->second;
			int raspuns = ((unsigned) P > stramosi.size() - 1 ) ? 0 : stramosi[stramosi.size() - 1 - P ];
			Solutii[index] = raspuns;
		}

	}
}


int main()
{
	fstream fin(infile, ios::in);
	fstream fout(outfile, ios::out);
	int N, M;
	fin >> N >> M;

	for(int i = 0 ; i < N; i++)
	{
		int parinte;
		fin >> parinte;
		G[parinte].push_back(i+1);
	}
	

	for(int i = 0 ; i < M; i++)
	{
		int Q, P;
		fin >> Q >> P;

		Intrebari[Q].push_back(make_pair(P, i));
	}

	DFS(0);

	for(int i = 0 ; i < M; i++)
	{
		fout << Solutii[i] << "\n";
	}

	fin.close();
	fout.close();
}