Pagini recente » Cod sursa (job #1656969) | Profil zdrobau_valeriu | Cod sursa (job #1669731) | Cod sursa (job #1501581) | Cod sursa (job #2072675)
#define DM 250001
#include <algorithm>
#include <fstream>
#include <queue>
#include <vector>
using namespace std;
ifstream fi ("stramosi.in");
ofstream fo ("stramosi.out");
int n, m, aux, cnt, o, w, s[DM], ord[DM], srt[DM];//s - stramosi; ord - ordinul fiecarui nod; srt - sirul sortat; cnt - nr de frunze introduse aka coloana pe care bag elemente
pair <int, int> crsp[DM];//corespondenta in matricea de stramosi
queue <int> q;//toate componentele conexe
vector <int> v[DM], p[DM];//v - muchiile; p - matricea de parinti
bool cmp(int a, int b)
{
if (ord[a] != ord[b])
return ord[a] > ord[b];
else
return a > b;
}
void dfs(int nod, int gr)
{
for (int i = 0; i < v[nod].size(); ++i)
{
ord[v[nod][i]] = gr + 1;
dfs(v[nod][i], gr + 1);
}
}
void stramosi(int frunza)
{
aux = frunza;
while (aux)
{
p[ord[aux]].push_back(aux);
if (crsp[aux] == make_pair(0, 0))
crsp[aux] = {ord[aux], cnt};
aux = s[aux];
}
}
int main()
{
fi >> n >> m;
for (int i = 1; i <= n; ++i)
{
srt[i] = i;
fi >> s[i];
if (s[i])
v[s[i]].push_back(i);
else
q.push(i);
}
while (!q.empty())
{
ord[q.front()] = 1;
dfs(q.front(), 1);
q.pop();
}
sort(srt + 1, srt + 1 + n, cmp);
for (int i = 1; i <= n; ++i)
if (crsp[srt[i]] == make_pair(0, 0))
{
stramosi(srt[i]);
++cnt;
}
for (int i = 1; i <= m; ++i)
{
fi >> o >> w;
if (w >= crsp[o].first)
fo << 0 << '\n';
else
fo << p[crsp[o].first-w][crsp[o].second] << '\n';
}
return 0;
}