Pagini recente » Cod sursa (job #1736046) | Cod sursa (job #1512897) | preONI 2008 - Regulament | Autentificare | Cod sursa (job #2565897)
#include<bits/stdc++.h>
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
int n,m,i,a,b,k,st[100010],dr[100010],l[400010],h,ne,leng;
pair<int,int> z[30][400010],aux;
vector<int> v[100010];
void dfs(int nod,int lvl)
{
z[0][++k]={lvl,nod};st[nod]=k;
for(auto it:v[nod])
{
dfs(it,lvl+1);
z[0][++k]={lvl,nod};dr[nod]=k;
}
}
int main()
{
fin>>n>>m;
for(i=1;i<n;i++)
{
fin>>a;
v[a].push_back(i+1);
}
dfs(1,0);
for(i=1;i<=k;i++) l[i]=l[i/2]+1;
for(h=1;h<=l[k];h++)
{
for(i=1;i<=k;i++) if(i+(1<<h)-1<=k)
{
ne=i+(1<<(h-1));//fout<<ne<<"\n";
if(z[h-1][i].first<z[h-1][ne].first)
z[h][i]=z[h-1][i];
else
z[h][i]=z[h-1][ne];
}
else z[h][i]=z[h-1][i];
}
for(i=1;i<=m;i++)
{
fin>>a>>b;
if(st[a]>st[b]) swap(a,b);
if(a==b){fout<<a<<"\n";continue;}
leng=l[st[b]-st[a]]-1;
aux=min(z[leng][st[a]],z[leng][st[b]-(1<<leng)+1]);
fout<<aux.second<<"\n";
}
return 0;
}