Pagini recente » Cod sursa (job #1325489) | Cod sursa (job #2738146) | Cod sursa (job #592979) | Cod sursa (job #740636) | Cod sursa (job #2877812)
#include <fstream>
#include <vector>
using namespace std;
ifstream f("stramosi.in");
ofstream g("stramosi.out");
vector <int> stramos[250011];
int lg[250011],lev[250011],tata[250011];
bool calc[250011],grad[250011];
void stramosi_build(int k)
{
if(calc[k]==1)
return;
stramosi_build(tata[k]);
lev[k]=lev[tata[k]]+1;
calc[k]=1;
for(int i=1;i<=lg[lev[k]];i++)
stramos[k].push_back(stramos[stramos[k][i-1]][i-1]);
}
int n,m,i,x,p,l,k;
int main()
{
f>>n>>m;
for(i=2;i<=n;i++)
lg[i]=lg[i/2]+1;
for(i=1;i<=n;i++)
{
f>>x;
tata[i]=x;
grad[x]=1;
stramos[i].push_back(x);
}
calc[0]=1;
for(i=1;i<=n;i++)
if(grad[i]==0)
stramosi_build(i);
for(i=1;i<=m;i++)
{
f>>l>>p;
if(p>lev[l])
{
g<<0<<'\n';
continue;
}
k=0;
while(p>0 && l>0)
{
if(p%2==1)
l=stramos[l][k];
p=p/2;
k++;
}
g<<l<<'\n';
}
return 0;
}