Pagini recente » Cod sursa (job #2814615) | Cod sursa (job #1110882) | Cod sursa (job #851476) | Cod sursa (job #1975056) | Cod sursa (job #2575829)
#include <bits/stdc++.h>
using namespace std;
ifstream f("lca.in");
ofstream g("lca.out");
struct noduri{vector <int> v;int h;}v[100003];///h=height
int n,m,i,j;
int x,y;
int t[18][100003];
void init()
{
f>>n>>m;
for(i=2;i<=n;i++)
{
int tata;
f>>tata;
t[0][i]=tata;
v[tata].v.push_back(i);
v[i].h=v[tata].h+1;
}
for(i=1;(1<<i)<=n;i++)
for(j=1;j<=n;j++)
t[i][j]=t[i-1][t[i-1][j]];///t[i][nod]=tatal lui nod cu 2^i mai sus decat nod
}
int get(int nod,int h)
{
int put=0;
while(1)
{
put++;
if(v[t[put][nod]].h<h || t[put][nod]==0){put--;break;}
}
nod=t[put][nod];
if(v[nod].h==h)return nod;
else return get(nod,h);
}
int main()
{
init();
for(i=1;i<=m;i++)
{
f>>x>>y;
if(v[x].h<v[y].h)swap(x,y);///ca sa modific pe x sa ajung la y
if(v[x].h!=v[y].h)x=get(x,v[y].h);///acum x si y sunt la aceeasi inaltime
if(x==y)g<<x<<'\n';
else
{
int putmax=0,hx=v[x].h;
for(putmax=1;(1<<putmax)<hx;putmax++);
for(j=putmax;j>=0;j--)
if(t[j][x] && t[j][x]!=t[j][y])
{
x=t[j][x];
y=t[j][y];
}
g<<t[0][x]<<'\n';
}
}
}