Pagini recente » Cod sursa (job #1246467) | Cod sursa (job #2418550) | Cod sursa (job #1316971) | Cod sursa (job #1045739) | Cod sursa (job #1853968)
#include <stdio.h>
#include <vector>
#include <queue>
using namespace std;
char lider[250001];
vector <int>fii[250001];
int a[20][250001];
FILE *fin = fopen("stramosi.in", "r");
FILE *fout = fopen("stramosi.out", "w");
int main()
{
int n,m;
fscanf(fin,"%d%d",&n,&m);
for(int i=1;i<=n;i++)
{
int x;
fscanf(fin,"%d",&x);
if(x==0) lider[i]=1;
fii[x].push_back(i);
}
for(int i=1;i<=n;i++)
{
if(lider[i]==1)
{
for(auto nod:fii[i])
{
a[0][nod]=i;
}
}
}
for(int i=1;i<=n;i++)
{
if(lider[i]==1)
{
queue <int> frontiera;
frontiera.push(i);
while(!frontiera.empty())
{
int nod = frontiera.front();
frontiera.pop();
for(auto node:fii[nod])
{
frontiera.push(node);
a[0][node]=nod;
for(int j=1;1<<j<=n;j++)
{
a[j][node]=a[j-1][a[j-1][node]];
}
}
}
}
}
for(int i=1;i<=m;i++)
{
int x,y;
fscanf(fin,"%d%d",&y,&x);
int pivot=1;
int putere=0;
while(pivot*2<=x)
{
pivot*=2;
putere++;
}
int actual=a[putere][y];
x-=pivot;
int incerc=1<<20;
putere=20;
while(x>0)
{
if(incerc>x)
{
incerc/=2;
putere--;
}
else
{
actual=a[putere][actual];
x-=incerc;
}
}
fprintf(fout,"%d\n",actual);
}
return 0;
}