Pagini recente » Cod sursa (job #2882794) | Cod sursa (job #647887) | Cod sursa (job #1922694) | Cod sursa (job #1686915) | Cod sursa (job #2883188)
#include <fstream>
#include<algorithm>
#include<vector>
using namespace std;
ifstream f("lca.in");
ofstream g("lca.out");
long long n,m,i,j;
long long rmq[20][1000001],a[100001],nr,b[100001],first[100001],diff,l,sh,x,y,k,lgt,lg[1000001];
vector <int> v[1000001];
void dfs(int k,int lvl)
{
nr++;
b[nr]=k;
first[k]=nr;
for(int i=0;i<v[k].size();i++)
{
dfs(v[k][i],lvl+1);
nr++;
a[nr]=lvl;
b[nr]=k;
}
}
int main()
{
f>>n>>m;
for(i=2;i<=n;i++)
{f>>x;
v[x].push_back(i);
}
dfs(1,0);
for(i=1;i<=nr;i++)
rmq[0][i]=b[i];
lg[1]=0;
for(i=2;i<=n;i++)
lg[i]=lg[i/2]+1;
for (i=1;(1<<i)<=nr;i++)
for (j=1;j+(1<<i)-1<=nr;j++)
rmq[i][j]=min(rmq[i-1][j],rmq[i-1][j+(1<<(i-1))]);
for (i=1;i<=m;i++)
{
f>>x>>y;
x=first[x];
y=first[y];
if(x>y)
swap(x,y);
diff=y-x+1;
l=lg[diff];
g<<min(rmq[l][x],rmq[l][y-(1<<l)+1])<<'\n';
}
return 0;
}