Pagini recente » Cod sursa (job #3243634) | Cod sursa (job #3197973) | Cod sursa (job #1664304) | Cod sursa (job #3196438) | Cod sursa (job #3273234)
#include <bits/stdc++.h>
#define NMAX 100500
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
int f[NMAX], a[NMAX], b[NMAX], use[NMAX], d[NMAX];
vector<int>v[NMAX];
void dfs(int node)
{
if(f[node]==0)
f[node]=a[0]+1;
a[++a[0]]=node;
b[++b[0]]=d[node];
use[node]=1;
for(auto i:v[node])
if(use[i]==0)
{
dfs(i);
a[++a[0]]=node;
b[++b[0]]=d[node];
}
}
int comp(int x, int y)
{
if(b[x]<b[y])
return x;
return y;
}
int n, m,x, y, z, lg, rmq[33][NMAX];
deque<int>q;
int main()
{
fin>>n>>m;
for(int i=2;i<=n;++i)
{
fin>>y;
v[y].push_back(i);
}
q.push_back(1);
d[1]=1;
while(!q.empty())
{
x=q.front();
q.pop_front();
for(auto i:v[x])
{
d[i]=d[x]+1;
q.push_back(i);
}
}
dfs(1);
for(int i=1;i<=n;++i)//rmq[lg][poz]=indice cu val min
rmq[0][i]=i;
for(int i=1;(1<<i)<=n;++i)
for(int j=1;j+(1<<i)<=n;++j)
rmq[i][j]=comp(rmq[i-1][j], rmq[i-1][j+(1<<(i-1))]);
//
// for(int i=1;i<=a[0];++i)
// cout<<a[i]<<" ";cout<<'\n';
for(;m>0;--m)
{
fin>>x>>y;
if(f[x]>f[y])
swap(x, y);
lg=log2(f[y]-f[x]+1);
z=comp(rmq[lg][f[x]], rmq[lg][f[x]+(1<<lg)]);
fout<<z<<'\n';
}
return 0;
}