Pagini recente » Cod sursa (job #2368109) | Cod sursa (job #2820207) | Cod sursa (job #1602722) | Cod sursa (job #412705) | Cod sursa (job #1398244)
#include <stdio.h>
#include <vector>
#include <bitset>
#define NMax 100002
#define INF 1<<30
#define minim(a,b)((a>b)?b:a)
#define maxim(a,b)((a>b)?a:b)
using namespace std;
std::vector<int> G[NMax],parc,nivel;
int n,m,x,y,a[NMax],nivelac,nod;
std::bitset<NMax> viz;
void parc_euler(int x0)
{
parc.push_back(x0);
nivel.push_back(nivelac);
if(a[x0]==0)a[x0]=parc.size()-1;
viz[x0] = true;
for(int i=0;i<G[x0].size();++i)
{
if(!viz[G[x0][i]])
{
++nivelac;
parc_euler(G[x0][i]);
--nivelac;
parc.push_back(x0);
nivel.push_back(nivelac);
}
}
}
int main()
{
freopen("lca.in","r",stdin);
freopen("lca.out","w",stdout);
scanf("%d %d",&n,&m);
for(int i=2;i<=n;++i)
{
scanf("%d",&x);
G[x].push_back(i);
}
parc_euler(1);
/*for(int i=0;i<parc.size();++i)printf("%d ",parc[i]);
printf("\n");
for(int i=0;i<nivel.size();++i)printf("%d ",nivel[i]);
printf("\n");
for(int i=1;i<=n;++i)printf("%d ",a[i]);*/
for(int i=1;i<=m;++i)
{
nivelac = INF;
scanf("%d %d",&x,&y);
for(int j=minim(a[x],a[y]);j<=maxim(a[x],a[y]);++j)
{
if(nivel[j]<nivelac)
{
nivelac = nivel[j];
nod = parc[j];
}
}
printf("%d\n",nod);
}
return 0;
}