Pagini recente » Cod sursa (job #2356337) | Cod sursa (job #501055) | Cod sursa (job #631796) | Cod sursa (job #1675741) | Cod sursa (job #1145263)
#include <cstdio>
#include <vector>
#include <bitset>
#include <cmath>
#define Nmax 200005
using namespace std;
int N,Q,daddy[Nmax];
int RMQ[18][Nmax];
int val[18][Nmax];
int pz[Nmax];
int nre;
vector<int> G[Nmax];
bitset<Nmax> used;
void read()
{
scanf("%d%d",&N,&Q);
for(int i = 2; i <= N; ++i)
{
scanf("%d",&daddy[i]);
G[daddy[i]].push_back(i);
}
}
void DFS(int k,int niv)
{
used[k] = 1;
RMQ[0][++nre] = k;
val[0][nre] = niv;
for(vector<int>::iterator it = G[k].begin(); it != G[k].end(); ++it)
if(!used[*it])
{
DFS(*it,niv+1);
RMQ[0][++nre] = k;
val[0][nre] = niv;
}
}
void Build()
{
int lmax = (int)log2(nre),gap = 1;
for(int line = 1; line <= lmax; ++line)
{
for(int i = 1; i <= nre; ++i)
if(i+gap > nre)
{
RMQ[line][i] = RMQ[line][i-1];
val[line][i] = val[line][i-1];
}
else
{
if(val[line-1][i] < val[line-1][i+gap])
{
RMQ[line][i] = RMQ[line-1][i];
val[line][i] = val[line-1][i];
}
else
{
RMQ[line][i] = RMQ[line-1][i+gap];
val[line][i] = val[line-1][i+gap];
}
}
gap <<= 1;
}
}
int Querry(int a,int b)
{
int len = (int)log2(b-a+1);
return min(RMQ[len][a],RMQ[len][b-(1<<len)+1]);
}
void solve()
{
int a,b;
for(int i = 1; i <= nre; ++i)
if(!pz[RMQ[0][i]])pz[RMQ[0][i]] = i;
while(Q--)
{
scanf("%d%d",&a,&b);
if(pz[a] < pz[b])
printf("%d\n",Querry(pz[a],pz[b]));
else
printf("%d\n",Querry(pz[b],pz[a]));
}
}
int main()
{
freopen("lca.in","r",stdin);
freopen("lca.out","w",stdout);
read();
DFS(1,1);
Build();
solve();
return 0;
}