Pagini recente » Cod sursa (job #1366402) | Cod sursa (job #2168496) | Cod sursa (job #2980786) | Cod sursa (job #2869377) | Cod sursa (job #3170119)
#include <bits/stdc++.h>
using namespace std;
typedef long long int ll;
#define MOD 1000000007
ifstream fin("lca.in");
ofstream fout("lca.out");
struct rmqs
{
int n,d;
} rmq[26][100011];
int p[100011];
vector<int> arb[100011];
int e[1000001];
int cnt;
void dfs(int n,int d)
{
rmq[0][++cnt]={n,d};
p[n]=cnt;
for(auto i : arb[n])
{
dfs(i,d+1);
rmq[0][++cnt]={n,d};
}
}
int lca(int x,int y)
{
x=p[x],y=p[y];
if(x > y)swap(x,y);
int len = e[y-x+1];
rmqs st=rmq[len][x];
rmqs dr=rmq[len][y-(1<<len)+1];
if(st.d < dr.d)return st.n;
else return dr.n;
}
int main()
{
int n,q;
fin >> n >> q;
for(int i=2;i<=n;i++)
{
int x;
fin >> x;
arb[x].push_back(i);
}
e[1]=0;
for(int i=2;i<=1000000;i++)e[i]=e[i/2]+1;
dfs(1,1);
for(int i=1;(1<<i) <= cnt;i++)
{
for(int j=1;j<=cnt;j++)
{
rmqs st = rmq[i-1][j];
if(j+(1<<(i-1)) <= cnt)
{
// 1 2 3 4 5 6 7 8
rmqs dr = rmq[i-1][j+(1<<(i-1))];
rmq[i][j]= st.d < dr.d ? st : dr;
}
else
{
rmq[i][j]= st;
}
}
}
while(q--)
{
int x,y;
fin >> x >> y;
fout << lca(x,y) << "\n";
}
}