Pagini recente » Cod sursa (job #3182579) | Cod sursa (job #113931) | Cod sursa (job #2233232) | Cod sursa (job #703928) | Cod sursa (job #2272679)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
struct efectiv_ceva
{
int nod,niv;
}a[100003];
int nr,poz[100003],n,m,x,y,d[22][100003],val;
bool marker[100003];
vector <int >g[100003];
void dfs(int nod,int niv)
{
marker[nod]=true;
a[++nr].nod=nod;
a[nr].niv=niv;
poz[nod]=nr;
for(int i=0;i<g[nod].size();i++)
{
if(marker[g[nod][i]]==false)
{
marker[g[nod][i]]=true;
dfs(g[nod][i], niv+1);
a[++nr].nod=nod;
a[nr].niv=niv;
}
}
}
int solve(int x,int y)
{
x=poz[x];
y=poz[y];
if(x>y)swap(x,y);
if(x==y)return a[x].nod;
int k=log2(y-x+1);
if(a[d[k][x]].niv<a[d[k][y-(1<<k)+1]].niv)
return a[d[k][x]].nod;
else return a[d[k][y-(1<<k)+1]].nod;
}
int main()
{
fin>>n>>m;
for(int i=2;i<=n;i++)
{
fin>>x;
g[x].push_back(i);
}
dfs(1,1);
val=2*n-1;
for(int i=1;i<=val;i++)
{
d[0][i]=i;
}
for(int i=1;i<=log2(val);i++)
{
for(int j=1;j<=(val-(1<<i)+1);j++)
{
if(a[d[i-1][j+(1<<(i-1))]].niv<a[d[i-1][j]].niv)
{
d[i][j]=d[i-1][j+(1<<(i-1))];
}
else d[i][j]=d[i-1][j];
}
}
for(int i=1;i<=m;i++)
{
fin>>x>>y;
fout<<solve(x,y)<<'\n';
}
return 0;
}