Pagini recente » Profil ilinca_luisa | Cod sursa (job #1771665) | Cod sursa (job #1703599) | Cod sursa (job #2729412) | Cod sursa (job #777509)
Cod sursa(job #777509)
#include<fstream>
using namespace std;
typedef struct lnod{
int vf;
struct lnod *next;
}*Nod;
Nod a[100005];
int e[200010],h[200010],f[100005],vf;
int lg[200010],rmq[20][200010];
void add(int x,int y){
Nod p=new lnod;
p->vf=y;
p->next=a[x];
a[x]=p;
}
void dfs(int nod,int lev){
h[++vf]=lev;
e[vf]=nod;
f[nod]=vf;
for(Nod p=a[nod];p;p=p->next)
{
dfs(p->vf,lev+1);
h[++vf]=lev;
e[vf]=nod;
}
}
void RMQ(){
int i,j,l;
for(i=2;i<=vf;++i)lg[i]=lg[i>>1]+1;
for(i=1;i<=vf;++i)rmq[0][i]=i;
for(i=1;(1<<i)<vf;++i)
for(j=1;j+(1<<i)-1<=vf ;++j)
{
l=1<<(i-1);
rmq[i][j]=rmq[i-1][j];
if(h[rmq[i-1][j+l]] < h[rmq[i][j]])
rmq[i][j]=rmq[i-1][j+l];
}
}
int main(void){
ifstream fin("lca.in");
ofstream fout("lca.out");
int N,M,i,x,y,v,w,l,dif,sh,rs;
fin>>N>>M;
for(i=2;i<=N;++i){ fin>>x; add(x,i); }
dfs(1,0);
RMQ();
while(M--)
{
fin>>x>>y;
v=f[x]; w=f[y];
if(v>w){ dif=v; v=w; w=dif; }
dif=w-v+1;
l=lg[dif];
sh=dif-(1<<l);
rs=rmq[l][v];
if(h[rs]>h[rmq[l][v+sh]])
rs=rmq[l][v+sh];
fout<<e[rs]<<'\n';
}
return 0;
}