Pagini recente » Cod sursa (job #1330620) | Cod sursa (job #736892) | Cod sursa (job #1991181) | Cod sursa (job #333077) | Cod sursa (job #2071662)
#include <fstream>
#include <vector>
#include <queue>
using namespace std;
ifstream in("stramosi.in");
ofstream out("stramosi.out");
const int Nmax = 250005;
const int Mmax = 300005;
int n, m, x, q, p, nr, curent;
queue <int> arbore;
vector <int> A[Nmax];
vector <pair<int, int>> query[Nmax];
int stiva[Mmax], rez[Mmax];
void DFS (int nod)
{
for (int i = 0; i < query[nod].size(); i++)
{
int first = query[nod][i].first;
int second = query[nod][i].second;
if (nr > query[nod][i].first)
rez[query[nod][i].second] = stiva[nr - query[nod][i].first];
else
rez[query[nod][i].second] = 0;
}
for (int 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();
nr = 1;
stiva[nr] = curent;
DFS(curent);
arbore.pop();
}
for (int i = 1; i <= m; i++)
out << rez[i] << '\n';
return 0;
}