Pagini recente » Cod sursa (job #2028702) | Cod sursa (job #2219625) | Cod sursa (job #1879932) | Cod sursa (job #1734075) | Cod sursa (job #2071694)
#include <fstream>
#include <vector>
#include <queue>
using namespace std;
ifstream in("stramosi.in");
ofstream out("stramosi.out");
const int N_max = 250005;
const int M_max = 300005;
int n, m, x, q, p, nr, curent;
queue <int> arbore;
vector <int> A[N_max];
vector <pair<int, int>> query[N_max];
int stiva[N_max], rez[M_max];
void DFS (int nod)
{
for (auto i = 0; i < query[nod].size(); i++)
if (nr > query[nod][i].first)
rez[query[nod][i].second] = stiva[nr - query[nod][i].first];
for (auto i = 0; i < A[nod].size(); i++)
{
stiva[++nr] = A[nod][i];
DFS(A[nod][i]);
}
nr--;
}
int main()
{
in >> n >> m;
for (int i = 1; i <= n; i++)
{
in >> x;
if (x == 0)
arbore.push(i);
else
A[x].push_back(i);
}
for (int i = 1; i <= m; i++)
{
in >> q >> p;
query[q].push_back(make_pair(p, i));
}
while (!arbore.empty())
{
curent = arbore.front();
arbore.pop();
nr = 1;
stiva[nr] = curent;
DFS(curent);
}
for (int i = 1; i <= m; i++)
out << rez[i] << '\n';
return 0;
}