Pagini recente » Cod sursa (job #642927) | Cod sursa (job #912714) | Cod sursa (job #1695025) | Cod sursa (job #349129) | Cod sursa (job #2713843)
#include <bits/stdc++.h>
using namespace std;
ifstream f("lca.in");
ofstream g("lca.out");
int n,m,parents[100001];
vector <int > G[100001];
#define INF 200000001
int euler[200005],k,SparseTable[18][200004],first[100001];
void EulerPath(int node, int ancestor)
{
euler[++k]=node;
if(first[node]==0) first[node]=k;
for(auto x:G[node])
{
if(x!=ancestor) {EulerPath(x,node); euler[++k]=node;}
}
}
void BuildTable()
{
int i,j;
for(i=1;i<=k;i++)
SparseTable[0][i]=euler[i];
for(j=1;j<=floor(log2(k));j++){
for(i=1;i<=(k-(1<<j)+1);i++)
{
SparseTable[j][i]=min(SparseTable[j-1][i+(1<<(j-1))],SparseTable[j-1][i]);
}
}
}
int main()
{
f>>n>>m;
int x,y,i;
for(i=2;i<=n;i++)
{
f>>parents[i];
G[parents[i]].push_back(i);
G[i].push_back(parents[i]);
}
EulerPath(1,1);
BuildTable();
int j,a,b;
for(i=1;i<=m;i++)
{
f>>x>>y;
a=first[x];
b=first[y];
if(a>b) swap(a,b);
j=(int)log2(b-a+1);
g<<min(SparseTable[j][a],SparseTable[j][b-(1<<j)+1])<<"\n";
}
}