Pagini recente » Cod sursa (job #1997156) | Cod sursa (job #1222005) | Cod sursa (job #2504490) | Cod sursa (job #2877326) | Cod sursa (job #3178223)
#include <fstream>
#include <vector>
#define sz 250000
using namespace std;
ifstream fin("stramosi.in");
ofstream fout("stramosi.out");
int n,m;
int r[19][sz+5];
vector <int> v[sz+5];
int xbound[sz+5];
int ybound[sz+5];
int o;
void dfs(int nod)
{
o++;
xbound[nod]=o;
for(auto& i : v[nod])
dfs(i);
o++;
ybound[nod]=o;
}
void preprocess()
{
for(int p = 1;(1<<p)<=n;p++)
for(int i = 1; i<=n;i++)
r[p][i] = r[p-1][r[p-1][i]];
}
bool is_ancestor(int ancestor,int kid)
{
return xbound[kid]>xbound[ancestor] && ybound[kid]<ybound[ancestor];
}
int get_ancestor(int nod,int val)
{
for(int i=18;i>=0;i--)
{
if(val >= (1<<i))
nod=r[i][nod],val-=(1<<i);
}
return nod;
}
int main()
{
fin>>n>>m;
for(int i=1;i<=n;i++)
fin>>r[0][i],v[r[0][i]].push_back(i);
dfs(0);
preprocess();
for(int i=1;i<=m;i++)
{
int x,y;
fin>>x>>y;
fout<<get_ancestor(x,y)<<'\n';
}
}