Cod sursa(job #974613)

Utilizator tudorv96Tudor Varan tudorv96 Data 17 iulie 2013 18:58:11
Problema Stramosi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.36 kb
#include <fstream>
#include <list>
#include <vector>
#include <iterator>
#include <algorithm>
#include <iostream>
using namespace std;

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

typedef pair <int, int> res;

#define sz (int)(st.size())

vector <vector <res> > q;
vector <list <int> > g;
vector <int> st, t, sol;
vector <bool> viz;
int n, m;

void dfs(const int start) {
	st.push_back(start);
	viz[start] = 1;
	while (sz) {
		int x = st.back(), go = 0;
		for (vector <res> :: iterator it = q[x].begin(); it != q[x].end(); ++it) {
			if (sz > (*it).first)
				sol[(*it).second] = st[sz-1-(*it).first];
			else
				sol[(*it).second] = 0;
		}
		if (!g[x].size()) {
			st.pop_back();
			continue;
		}
		for (list <int> :: iterator it = g[x].begin(); it != g[x].end(); ++it)
			if (!viz[*it]) {
				go++;
				viz[*it] = 1;
				st.push_back(*it);
				break;
			}
		if (!go)
			st.pop_back();
	}
}

int main() {
	fin >> n >> m;
	g.resize(n+1);
	q.resize(n+1);
	t.resize(n+1);
	sol.resize(m);
	viz.resize(n+1);
	for (int i = 1; i <= n; ++i) {
		int x;
		fin >> x;
		g[x].push_back(i);
		t[i] = x;
	}
	for (int i = 0; i < m; ++i) {
		int x, y;
		fin >> x >> y;
		q[x].push_back(res(y, i));
	}
	fin.close();
	for (list <int> :: iterator it = g[0].begin(); it != g[0].end(); ++it)
		dfs(*it);
	copy (sol.begin(), sol.end(), ostream_iterator <int> (fout, "\n"));
	fout.close();
}