Pagini recente » Cod sursa (job #523114) | Cod sursa (job #637286) | Cod sursa (job #1759250) | Statistici Tudosie Delia (delia.tudosie) | Cod sursa (job #974613)
Cod sursa(job #974613)
#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();
}