Pagini recente » Cod sursa (job #3130331) | Cod sursa (job #3255945) | Cod sursa (job #2743265) | Cod sursa (job #1998263) | Cod sursa (job #323976)
Cod sursa(job #323976)
#include<cstdio>
#include <vector>
using namespace std;
struct nod {
int gr;
vector<int> fii;
};
vector<int> viz, s;
vector<nod> arb;
vector< vector<int> > p(250001);
int exp[19]={1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,32768,65536,131072,262144};
void df(int vf)
{
int i,j,k;
s[1]=vf;
vf=1;
while (vf>0)
{
i=s[vf];
j=0;
if (arb[i].fii.size()>0)
{
j=arb[i].fii.back();
arb[i].fii.pop_back();
}
if (j>0)
{
viz[j]=1;
vf++;
s[vf]=j;
for (k=1;k<19;k++)
if (vf-exp[k]>0)
p[j][k]=s[vf-exp[k]];
else
p[j][k]=0;
}
else
vf--;
}
}
int main()
{
int n,vf,i,j,m,k;
freopen("stramosi.in","r",stdin);
freopen("stramosi.out","w",stdout);
scanf("%d %d",&n,&m);
viz.reserve(n+1);
s.reserve(n+1);
arb.reserve(n+1);
p[0].reserve(19);
for (i=0;i<=n;i++)
{
p[i].reserve(19);
for (j=0;j<19;j++)
p[i][j]=0;
}
for (i=1;i<=n;i++)
{
scanf("%d",&j);
arb[i].gr=0;
if (j>0)
{
arb[j].fii.push_back(i);
arb[i].gr=1;
p[i][0]=j;
}
}
vf=0;
for (i=1;i<=n;i++)
if (arb[i].gr==0)
{
vf=i;
df(i);
}
while (m>0)
{
m--;
scanf("%d%d",&j,&i);
// stramosul de ord i al lui j
k=0;
while (i>0)
{
if (i%2==1)
j=p[j][k];
k++;
i=i/2;
}
printf("%d\n",j);
}
return 0;
}