Pagini recente » Cod sursa (job #2786777) | Cod sursa (job #2043361) | Cod sursa (job #2351439) | Cod sursa (job #1287502) | Cod sursa (job #3143666)
#include<bits/stdc++.h>
using namespace std;
ifstream F("lca.in");
ofstream G("lca.out");
int n,m,i,j,k,r,t[100001],p[18][100001],l[100001];
bitset<100001> b;
vector<int> v[100001];
queue<int> q;
int main()
{
for(F>>n>>m,i=2;i<=n;F>>j,v[j].push_back(i),t[i++]=j);
for(q.push(1);!q.empty();q.pop())
for(i=q.front(),k=v[i].size(),j=0;j<k;++j)
if(v[i][j]>1&&!l[v[i][j]])
l[v[i][j]]=l[i]+1,q.push(v[i][j]);
for(j=0;1<<j<=n;++j)
for(i=1;i<=n;p[j][i++]=-1);
for(i=1;i<=n;p[0][i]=t[i],++i);
for(j=1;1<<j<=n;++j)
for(i=1;i<=n;++i)
if(p[j-1][i]!=-1)
p[j][i]=p[j-1][p[j-1][i]];
for(;m--;) {
if(F>>i>>j,l[i]<l[j])
swap(i,j);
for(r=1;1<<r<=l[i];++r);
for(k=--r;k>=0;--k)
if(l[i]-(1<<k)>=l[j])
i=p[k][i];
if(i==j)
G<<i<<'\n';
else {
for(k=r;k>=0;--k)
if(p[k][i]!=-1&&p[k][i]!=p[k][j])
i=p[k][i],j=p[k][j];
G<<t[i]<<'\n';
}
}
return 0;
}