Pagini recente » Cod sursa (job #2011024) | Cod sursa (job #2132783) | Cod sursa (job #1736434) | Profil YvoFloarea | Cod sursa (job #2022143)
#include <bits/stdc++.h>
#define Nmax 100005
using namespace std;
ifstream f("lca.in");
ofstream g("lca.out");
list <int> G[Nmax];
int ap[Nmax];
int niv[Nmax];
vector <int> euler;
int a[20][Nmax<<2];
int Log2[Nmax<<2];
void DFS(int x)
{
euler.push_back(x);
if(ap[x]==INT_MAX) ap[x]=euler.size()-1;
list <int> :: iterator it;
for(it=G[x].begin();it!=G[x].end();it++)
{
niv[*it]=niv[x]+1;
DFS(*it);
euler.push_back(x);
}
}
inline int minn(int x, int y)
{
if(niv[x]<niv[y]) return x;
else return y;
}
int main()
{
int n,m,i,j,x,y,k;
f>>n>>m;
ap[1]=INT_MAX;
niv[1]=0;
for(i=2;i<=n;i++)
{
ap[i]=INT_MAX;
f>>j;
G[j].push_back(i);
}
euler.push_back(0);
DFS(1);
int N=*max_element(ap+1,ap+n+1);
for(i=1;i<=N;i++)
a[0][i]=euler[i];
for(i=2;i<=N;i++)
Log2[i]=Log2[i/2]+1;
for(i=1;(1<<i)<=N;i++)
for(j=1;j+(1<<i)<=N+1;j++)
a[i][j]=minn(a[i-1][j],a[i-1][j+(1<<i-1)]);
for(;m;--m)
{
f>>x>>y;
if(ap[x]>ap[y]) swap(x,y);
k=Log2[ap[y]-ap[x]+1];
g<<minn(a[k][ap[x]],a[k][ap[y]-(1<<k)+1])<<'\n';
}
return 0;
}