Pagini recente » Cod sursa (job #1092143) | Cod sursa (job #1334933) | Cod sursa (job #1323892) | Cod sursa (job #1243448) | Cod sursa (job #859263)
Cod sursa(job #859263)
#include <iostream>
#include <fstream>
#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;
int n, m, hmax, H[250010], put[35], k;
int a[20][250010];
int tata[250010];
vector <int> G[250010];
inline void DFS(int x)
{
vector <int>::iterator it;
for(it=G[x].begin(); it!=G[x].end(); it++)
{
DFS(*it);
H[*it] = H[x] + 1;
hmax = max(hmax, H[*it]);
}
}
inline void Calc()
{
int i, j
for(i=1; i<=n; i++)
a[0][i] = tata[i];
k = 20;
for(i=1; i<=k; i++)
{
for(j=1; j<=n; j++)
a[i][j] = a[i-1][a[i-1][j]];
}
put[0] = 1;
for(i=1; i<=25; i++)
put[i] = put[i-1]*2;
}
inline int Stramos(int q, int p)
{
if (q == 0)
return 0;
if (p == 0)
return q;
int i;
for(i=k; put[i] > p;i--);
// i - exponent, put[i] - puterea
return Stramos(a[i][q], p-put[i]);
}
inline void Solve()
{
ifstream f("stramosi.in");
ofstream g("stramosi.out");
int i;
f>>n>>m;
for(i=1; i<=n; i++)
{
f>>tata[i];
if (tata[i]!=0)
G[tata[i]].push_back(i);
}
Calc();
int p, q;
while(m)
{
m--;
f>>q>>p; // care este al p-lea stramos al lui q
if (p>n)
g<<"0\n";
else
g<<Stramos(q, p)<<"\n";
}
f.close();
g.close();
}
int main()
{
Solve();
return 0;
}