Pagini recente » Cod sursa (job #157230) | Cod sursa (job #2808946) | Cod sursa (job #551348) | Cod sursa (job #2878718) | Cod sursa (job #2149583)
#include <fstream>
#define MAXN 250005
#define LOGN 25
using namespace std;
ifstream fi("stramosi.in");
ofstream fo("stramosi.out");
int n,m;
int P[MAXN]; /// parintele nodului
int stramos[LOGN][MAXN]; /// stramosul nodului j aflat la 1<<i distanta
//vector <int> G[MAXN];
void precalc()
{
for (int i=1; i<=n; i++)
stramos[0][i]=P[i];
for (int dec=1; (1<<dec)<=n; dec++)
{
for (int i=1; i<=n; i++)
{
stramos[dec][i]=stramos[dec-1][stramos[dec-1][i]];
}
}
}
void afisarePrecalc()
{
for (int i=1; i<=n; i++)
{
for (int dec=0; (1<<dec)<=n; dec++)
{
fo<<"nodul "<<i<<" la "<<(1<<dec)<<": "<<stramos[dec][i]<<"\n";
}
}
}
int query(int nod,int dep)
{
int curent=nod; /// nodul curent
for (int bit=0; (1<<bit)<=dep; bit++)
if (dep&(1<<bit))
{
nod=stramos[bit][nod];
}
return nod;
}
int main()
{
fi>>n>>m;
for (int i=1; i<=n; i++)
{
fi>>P[i];
//G[P[i]].push_back(i);
}
precalc();
//afisarePrecalc();
while (m--)
{
int p,q;
fi>>q>>p;
int rez=query(q,p);
fo<<rez<<"\n";
}
return 0;
}