Pagini recente » Cod sursa (job #2850558) | Cod sursa (job #1948088) | Cod sursa (job #1611875) | Cod sursa (job #2242792) | Cod sursa (job #969675)
Cod sursa(job #969675)
#include <fstream>
using namespace std;
ifstream fin("lca.in");
ofstream fout ("lca.out");
struct node
{
int nr;
node *next;
}*v[100001];
int E[200001],L[200001],F[200001],RMQ[200001][18],log[200001];
int n,m,t,x,i,j,k,temp;
void create_edge (int a, int b)
{
node *d=new node;
d->nr=b;
d->next=v[a];
v[a]=d;
}
void dfs (int x, int lv)
{
++t;
E[t]=x;
L[t]=lv;
F[x]=t;
for (node *d=v[x]; d!=NULL; d=d->next)
{
dfs (d->nr,lv+1);
++t;
E[t]=x;
L[t]=lv;
}
}
int main()
{
fin>>n>>m;
for (i=1;i<n;i++)
{
fin>>x;
create_edge (x,i+1);
}
dfs (1,1);
log[1]=0;
for (i=2; i<=t; i++) log[i]=log[i/2]+1;
for (i=1; i<=t; i++) RMQ[i][0]=i;
for (j=1; 1<<j<=t; j++)
{
int p=1<<(j-1);
for (i=1; i<=t-(1<<j)+1; i++)
if (L[RMQ[i][j-1]] < L[RMQ[i+p][j-1]]) RMQ[i][j] = RMQ[i][j-1];
else RMQ[i][j] = RMQ[i+p][j-1];
}
for (k=1; k<=m; k++)
{
int a,b;
fin>>a>>b;
a=F[a];
b=F[b];
if (b<a)
{
temp=a;
a=b;
b=temp;
}
int c=log[b-a+1];
if (L[RMQ[a][c]] < L[RMQ[b-(1<<c)+1][c]]) fout<<E[RMQ[a][c]];
else fout<<E[RMQ[b-(1<<c)+1][c]];
fout<<"\n";
}
}