Pagini recente » Cod sursa (job #1374064) | Cod sursa (job #1839643) | Cod sursa (job #2867714) | Cod sursa (job #622344) | Cod sursa (job #1732431)
#include<iostream>
#include<fstream>
#include<vector>
#include<map>
#define DX 250100
using namespace std;
fstream fin("stramosi.in",ios::in),fout("stramosi.out",ios::out);
int inainte[DX],stra[DX][18],put[20];
vector<int> v[DX];
map<int,int> mp;
int search(int nod,int numar)
{
if(numar==0) return nod;
return search(stra[nod][mp[inainte[numar]]],numar-inainte[numar]);
}
void build(int nod,int pre,int nr)
{
int i,r;
for(i=1;put[i]<=nr;i++)
{
stra[nod][i]=search(pre,put[i]-1);
}
for(auto x: v[nod]) build(x,nod,nr+1);
}
int main()
{
int a,b,n,m,aux,stop,i,j=1;
fin>>n>>m;
for(i=1;i<=n;i++)
{
fin>>stra[i][0];
v[stra[i][0]].push_back(i);
}
for(i=0; ;i++)
{
aux=(1<<i);
stop=(1<<(1+i));
if(aux>n) break;
put[i]=aux;
mp[aux]=i;
for(j=aux;j<stop && j<=n;j++) inainte[j]=aux;
}
for(i=1;i<=n;i++)
{
if(stra[i][0]==0)
{
build(i,0,0);
}
}
for(i=1;i<=m;i++)
{
fin>>a>>b;
fout<<search(a,b)<<"\n";
}
}