Pagini recente » Cod sursa (job #3212254) | Cod sursa (job #821188) | Cod sursa (job #429854) | Cod sursa (job #2403585) | Cod sursa (job #2493716)
#include <bits/stdc++.h>
using namespace std;
ifstream f("stramosi.in");
ofstream g("stramosi.out");
const int NMAX = 25e4 + 5, MMAX = 20;
int N, Q, T[NMAX];
vector < int > G[NMAX];
int Ancestor[MMAX][NMAX];
static inline void Read ()
{
f.tie(NULL);
f >> N >> Q;
for(int i = 1; i <= N; ++i)
{
f >> T[i];
if(T[i] == 0)
continue;
G[T[i]].push_back(i);
}
return;
}
static inline void Precalculation ()
{
for(int i = 1; i <= N; ++i)
if(T[i])
Ancestor[0][i] = T[i];
for(int p = 1; (1 << p) <= N; ++p)
for(int i = 1; i <= N; ++i)
Ancestor[p][i] = Ancestor[p - 1][Ancestor[p - 1][i]];
return;
}
static inline void Solve ()
{
while(Q--)
{
int Node = 0, cnt = 0;
f >> Node >> cnt;
if(cnt == 0)
{
g << Node << '\n';
continue;
}
if(T[Node] == 0)
{
g << 0 << '\n';
continue;
}
for(int p = 0; (1 << p) <= cnt; ++p)
if(cnt & (1 << p))
Node = Ancestor[p][Node];
g << Node << '\n';
}
return;
}
int main()
{
Read();
Precalculation();
Solve();
return 0;
}