Cod sursa(job #677364)

Utilizator Cosmin1490Balan Radu Cosmin Cosmin1490 Data 10 februarie 2012 03:04:07
Problema Stramosi Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.47 kb
#include <fstream>
#include <vector>
#include <stack>
#include <map>
using namespace std;

#define NSIZE 250001
const char* infile = "stramosi.in";
const char* outfile = "stramosi.out";

vector<int> G[NSIZE];

multimap<int, pair<int, int> > Tabel;

vector<int> Solutii;

vector<int> stramosi;

void DFS(int root)
{
	stramosi.push_back(root);
	pair<multimap<int, pair<int, int> >::iterator, multimap<int, pair<int, int > >::iterator > intrebari;
	intrebari = Tabel.equal_range(root);

	for( multimap<int, pair<int, int> >::iterator itr = intrebari.first;
		itr != intrebari.second;
		itr ++)
	{
		int Q = itr->first;
		int P = itr->second.first;
		int index = itr->second.second;
		int raspuns;

		if((unsigned int) P > stramosi.size() -1 )
		{
			raspuns = 0;
		}
		else
		{
			raspuns = stramosi[stramosi.size() - 1 - P];
		}
		Solutii[index] = raspuns;
	}

	for(unsigned int i = 0; i < G[root].size(); ++i)
	{
		DFS(G[root][i]);
	}

	stramosi.pop_back();
}


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);
	}
	
	Solutii.reserve(M);
	Solutii.resize(M);

	for(int i = 0 ; i < M; i++)
	{
		int Q, P;
		fin >> Q >> P;
		Tabel.insert(make_pair(Q, make_pair(P, i)));
	}
	DFS(0);

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

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