Pagini recente » Cod sursa (job #529431) | Cod sursa (job #2783558) | Cod sursa (job #1078427) | Cod sursa (job #2604998) | Cod sursa (job #2908331)
#include <fstream>
using namespace std;
ifstream in ("stramosi.in");
ofstream out ("stramosi.out");
const int max_size = 25e4 + 1, rmax = 18;
int t[rmax][max_size], nivel[max_size], lg[max_size], n;
void lvl (int x)
{
if (nivel[x] != 0)
{
return;
}
lvl(t[0][x]);
nivel[x] = 1 + nivel[t[0][x]];
}
int anc (int x, int ord)
{
int e = 0;
while (ord > 0)
{
if (ord % 2 == 1)
{
x = t[e][x];
}
e++;
ord /= 2;
}
return x;
}
int main ()
{
int q;
in >> n >> q;
for (int i = 1; i <= n; i++)
{
in >> t[0][i];
if (t[0][i] == 0)
{
nivel[i] = 1;
}
}
for (int e = 1; e < rmax; e++)
{
for (int i = 1; i <= n; i++)
{
t[e][i] = t[e - 1][t[e - 1][i]];
}
}
for (int i = 2; i <= n; i++)
{
lg[i] = 1 + lg[i / 2];
}
for (int i = 1; i <= n; i++)
{
lvl(i);
}
while (q--)
{
int x, d;
in >> x >> d;
out << anc(x, d) << '\n';
}
in.close();
out.close();
return 0;
}