Pagini recente » Cod sursa (job #997548) | Cod sursa (job #2510273) | Cod sursa (job #777261) | Cod sursa (job #2295112) | Cod sursa (job #2601134)
#include<fstream>
#include<cmath>
#include<vector>
#include<iostream>
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
int n,q,i,f,a,b,timp;
vector<int>v[100001];
bool viz[100001];
int t[100001],d[100001];
vector<int>vt;
pair<int,int>mat[18][300001];
void adauga(int a,int b)
{
v[a].push_back(b);
v[b].push_back(a);
}
void dfs(int vf)
{
viz[vf]=true;
vt.push_back(vf);
t[vf]=vt.size()-1;
for(int i=0; i<v[vf].size(); i++)
{
int fiu=v[vf][i];
if(!viz[fiu])
{
d[fiu]=d[vf]+1;
dfs(fiu);
vt.push_back(vf);
t[vf]=vt.size()-1;
}
}
}
int main()
{
fin>>n>>q;
for(i=2; i<=n; i++)
{
fin>>f;
adauga(f,i);
}
dfs(1);
for(i=0; i<vt.size(); i++)
{
mat[0][i].first=d[vt[i]];
mat[0][i].second=vt[i];
}
for(i=1; i<=17; i++)
{
int p=(1<<i);
for(int j=0; j<=(int)vt.size()-p; j++)
{
mat[i][j]=min(mat[i-1][j],mat[i-1][j+p/2]);
}
}
for(i=1; i<=q; i++)
{
fin>>a>>b;
if(t[b]<t[a])
swap(a,b);
int p=log2(t[b]-t[a]+1);
fout<<(min(mat[p][t[a]],mat[p][t[b]-(1<<p)+1])).second<<"\n";
}
}