Mai intai trebuie sa te autentifici.
Cod sursa(job #2948197)
Utilizator | Data | 27 noiembrie 2022 13:48:02 | |
---|---|---|---|
Problema | Lowest Common Ancestor | Scor | 70 |
Compilator | cpp-64 | Status | done |
Runda | Arhiva educationala | Marime | 2.15 kb |
#include <bits/stdc++.h>
using namespace std;
int A[18][100005],level[100005];
vector <int> V[100005];
void DFS(int k)
{
for(auto x:V[k])
{
level[x]=level[k]+1;
DFS(x);
}
}
int val;
int sameA(int a,int b)
{
if(level[a]<level[b])
return 0;
for(int exp=val;exp>=0;exp--)
{
if(level[a]-(1<<exp)>=level[b])
{
a=A[exp][a];
}
}
if(a==b)
return 1;
return 0;
}
int main()
{
ifstream fin("lca.in");
ofstream fout("lca.out");
ios_base::sync_with_stdio(false);
fin.tie(0);
fout.tie(0);
int n,Q,a,b;
fin>>n>>Q;
val=log2(n);
for(int i=2;i<=n;i++)
{
fin>>A[0][i];
V[A[0][i]].push_back(i);
}
level[1]=1;
DFS(1);
for(int i=1;i<=val;i++)
for(int j=1;j<=n;j++)
A[i][j]=A[i-1][A[i-1][j]];
for(int q=1;q<=Q;q++)
{
fin>>a>>b;
if(a==b)
{
fout<<b<<"\n";
}
else if(sameA(a,b)==1)
{
fout<<b<<"\n";
}
else if(sameA(b,a)==1)
{
fout<<a<<"\n";
}
else
{
if(level[a]<level[b])
{
for(int exp=val;exp>=0;exp--)
{
if(level[b]-(1<<exp)>=level[a])
{
b=A[exp][b];
}
}
}
else if(level[a]>level[b])
{
for(int exp=val;exp>=0;exp--)
{
if(level[a]-(1<<exp)>=level[b])
{
a=A[exp][a];
}
}
}
if(level[a]==level[b])
{
for(int exp=val;exp>=0;exp--)
{
if(A[exp][a]!=A[exp][b])
{
a=A[exp][a];
b=A[exp][b];
}
}
fout<<A[0][a]<<'\n';
}
}
}
return 0;
}