Pagini recente » Cod sursa (job #2695440) | Cod sursa (job #1220918) | Cod sursa (job #1910057) | Cod sursa (job #803819) | Cod sursa (job #3328420)
#include <fstream>
#include<bits/stdc++.h>
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
const int N_MAX=1e5;
int depth[N_MAX+5];
const int PMAX=18;
int v[N_MAX+5];
int e[N_MAX+5];
int start[N_MAX+5];
vector<int>tree[N_MAX+5];
vector<int>euler;
int nr=0;
pair<int,int>r[PMAX][2*N_MAX+5];
void dfs(int nod)
{
euler.push_back(nod);
nr=euler.size();
start[nod]=nr;
r[0][nr].first=nod;
r[0][nr].second=depth[nod];
for(auto x:tree[nod])
{
depth[x]=depth[nod]+1;
dfs(x);
euler.push_back(nod);
nr=euler.size();
r[0][nr].first=nod;
r[0][nr].second=depth[nod];
}
}
int main()
{
int n,q,x,y;
fin>>n>>q;
for(int i=2; i<=n; i++)
{
fin>>x;
tree[x].push_back(i);
}
dfs(1);
e[1]=0;
n=2*n-1;
for(int i=2;i<=n;i++)
{
e[i]=e[i/2]+1;
}
for(int p=1;(1<<p)<=n;p++)
{
for(int i=1;i<=n;i++)
{
r[p][i]=r[p-1][i];
int j=i+(1<<(p-1));
if(j<=n&&r[p][i].second>r[p-1][j].second)
{
r[p][i]=r[p-1][j];
}
}
}
while(q--)
{
fin>>x>>y;
if(start[x]<start[y]){
int E=e[start[y]-start[x]+1];
int len=(1<<E);
if(r[E][start[x]].second<r[E][start[y]-len+1].second)
{
fout<<r[E][start[x]].first<<"\n";
}
else fout<<r[E][start[y]-len+1].first<<"\n";
}
else
{
int E=e[start[x]-start[y]+1];
int len=(1<<E);
if(r[E][start[y]].second<r[E][start[x]-len+1].second)
{
fout<<r[E][start[y]].first<<"\n";
}
else fout<<r[E][start[x]-len+1].first<<"\n";
}
}
return 0;
}