Pagini recente » Cod sursa (job #108335) | Cod sursa (job #3000011) | Cod sursa (job #617400) | Cod sursa (job #614509) | Cod sursa (job #3144147)
#include <fstream>
#include <vector>
#define max_log 20
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
int n,q;
int st[100005];
int dr[100005];
int r[max_log][100005];
vector <int> v[100005];
int p[100005];
bool viz[100005];
int nr;
void dfs(int nod)
{
viz[nod]=true;
st[nod]=++nr;
for(auto& i : v[nod])
if(!viz[i])
dfs(i);
dr[nod]=++nr;
}
void calculate_log()
{
for(int i=1;i<=n;i++)
r[0][i]=p[i];
for(int i=1;i<=max_log;i++)
for(int j=1;j<=n;j++)
r[i][j] = r[i-1][r[i-1][j]];
}
bool ancestor(int a,int b)
{
return st[a]<=st[b] && dr[b] <= dr[a];
}
int lca(int a,int b)
{
if(ancestor(a,b))
return a;
if(ancestor(b,a))
return b;
for(int i=max_log;i>=0;i--)
{
int nod = r[i][a];
if(nod>0 && !ancestor(nod,b))
a=nod;
}
return r[0][a];
}
int main()
{
fin>>n>>q;
for(int i=2;i<=n;i++)
{
fin>>p[i];
v[p[i]].push_back(i);
}
dfs(1);
calculate_log();
for(int i=1;i<=q;i++)
{
int x,y;
fin>>x>>y;
fout<<lca(x,y)<<'\n';
}
}