Pagini recente » Cod sursa (job #3155401) | Cod sursa (job #1055582) | Cod sursa (job #87127) | Cod sursa (job #877295) | Cod sursa (job #3242087)
#include <bits/stdc++.h>
const std :: string FILENAME = "stramosi";
std :: ifstream in (FILENAME + ".in");
std :: ofstream out (FILENAME + ".out");
const int NMAX = 25e4 + 5;
const int LOGMAX = 18;
int n;
int m;
int x;
int y;
int p;
int q;
int parent[NMAX];
int dp[LOGMAX][NMAX];
void precalc()
{
for(int i = 1; i <= n; i ++)
{
dp[0][i] = parent[i];
}
for(int i = 1; i < LOGMAX; i ++)
{
for(int j = 1; j <= n; j ++)
{
dp[i][j] = dp[i - 1][dp[i - 1][j]];// al 2 ^ilea stramos al lui nodului j
}
}
}
inline int find(int nod, int stramos)
{
for(int shift = LOGMAX - 1; shift >= 0; shift --)
{
if(stramos & (1 << shift))
{
nod = dp[shift][nod];
stramos ^= (1 << shift);
}
}
return nod;
}
int main()
{
in >> n >> m;
for(int i = 1; i <= n; i ++)
{
in >> parent[i];
}
precalc();
while(m --)
{
in >> q >> p;
out << find(q, p) << '\n';
}
return 0;
}