Pagini recente » Cod sursa (job #1210124) | Cod sursa (job #578063) | Cod sursa (job #684037) | Cod sursa (job #1784048) | Cod sursa (job #1388993)
#include <iostream>
#include <fstream>
#include <vector>
#include <map>
#include <unordered_map>
using namespace std;
const int MAXN = 250010, MAXM = 300010;
int N, M;
int st[MAXN];
vector<int> adj[MAXN], vf;
vector<bool> viz(MAXN, 0);
struct pairhash {
public:
template <typename T, typename U>
std::size_t operator()(const std::pair<T, U> &x) const
{
return std::hash<T>()(x.first) ^ std::hash<U>()(x.second);
}
};
unordered_map<int, vector<int>> dp;
unordered_map<int, pair<int, int> > query;
map<pair<int, int>, int> sol;
void dfs(int u, int nivel = 0) {
st[nivel] = u;
viz[u] = true;
if (dp.find(u) != dp.end()) {
for (int a : dp[u]) {
sol[make_pair(u, a)] = st[nivel - a];
}
}
for (int v : adj[u]) {
if (!viz[v]) {
dfs(v, nivel + 1);
}
}
}
int main()
{
int t, Q, P;
ifstream f("stramosi.in");
freopen("stramosi.out", "w", stdout);
f >> N >> M;
for (int i = 1; i <= N; i++) {
f >> t;
if (t == 0) vf.push_back(i);
else adj[t].push_back(i);
}
for (int i = 0; i < M; i++) {
f >> P >> Q;
dp[P].push_back(Q);
query[i + 1] = make_pair(P, Q);
}
for (int x : vf) {
dfs(x);
}
for (int i = 1; i <= M; i++) {
cout << sol[query[i]] << '\n';
}
f.close();
return 0;
}