Pagini recente » Cod sursa (job #2260145) | Cod sursa (job #1824596) | Cod sursa (job #671644) | Cod sursa (job #1059628) | Cod sursa (job #2072270)
#include <fstream>
#include <vector>
#include <queue>
using namespace std;
ifstream in("stramosi.in");
ofstream out("stramosi.out");
const int N_max = 350005;
const int M_max = 400005;
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 (int 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 (int i = 0; i < A[nod].size(); i++)
{
stiva[++nr] = A[nod][i];
DFS(A[nod][i]);
}
if (nr > 0)
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;
}