Pagini recente » Cod sursa (job #3154381) | Cod sursa (job #2960916) | Cod sursa (job #3151887) | Cod sursa (job #443779) | Cod sursa (job #2364504)
#include <iostream>
#include <fstream>
#include <cstring>
using namespace std;
ifstream f("lca.in");
ofstream g("lca.out");
int k,n,Q;
int e[200002],h[200002],B[100002],lo1[200002];
int st[400002][20];
struct chld{int c;chld *n;}*a[100002];
void makee(int ch,int cn)
{
++k;
B[cn]=k;
h[k]=ch;
e[k]=cn;
chld *s=a[cn];
while(s!=NULL)
{
makee(ch+1,s->c);
++k;h[k]=ch;e[k]=cn;
s=s->n;
}
}
void ist()
{
for(int i=2;i<=k;++i)lo1[i]=lo1[i/2]+1;
for(int i=1;i<=k;++i)st[i][0]=i;
for(int i=1;(1<<i)<=k;++i)for(int j=1;j<=k-(1<<i);++j)
{
int t=(1<<(i-1));
if(h[st[j][i-1]]<=h[st[j+t][i-1]])st[j][i]=st[j][i-1];
else st[j][i]=st[j+t][i-1];
}
}
int lca(int p1,int p2)
{
int t=lo1[p2-p1+1];int ot=p2-p1+1-(1<<t);
if(h[st[p1][t]]>h[st[p1+ot][t]])return st[p1+ot][t];
return st[p1][t];
}
int main()
{
f>>n>>Q;
for(int i=1;i<=n;++i)a[i]=NULL;
for(int i=2;i<=n;++i)
{
int t;f>>t;
chld *s=new chld;
s->c=i;s->n=a[t];a[t]=s;
}
makee(0,1);
ist();
for(;Q>0;--Q)
{
int p1,p2;f>>p1>>p2;p1=B[p1];p2=B[p2];
if(p1>p2)swap(p1,p2);
g<<e[lca(p1,p2)]<<'\n';
}
}