Pagini recente » Cod sursa (job #2469786) | Cod sursa (job #1585801) | Cod sursa (job #2038609) | Cod sursa (job #642344) | Cod sursa (job #2525670)
#include <bits/stdc++.h>
#define mp make_pair
#define Minim(i,j) l[i]<l[j] ? i : j
using namespace std;
ifstream f("lca.in");
ofstream g("lca.out");
int n,m,k;
int poz[1<<17],e[1<<18],l[1<<18],lg[1<<18],dp[18][1<<18];
vector <int> v[1<<17];
void Euler(int nod,int niv)
{ e[++k]=nod;
l[k]=niv;
poz[nod]=k;
for(int i=0; i<v[nod].size(); i++)
{ Euler(v[nod][i],niv+1);
e[++k]=nod;
l[k]=niv;
}
}
int main()
{ f>>n>>m;
for(int x,i=2; i<=n; i++)
{ f>>x;
v[x].push_back(i);
}
Euler(1,1);
for(int i=1; i<=k; i++)
dp[0][i]=i;
for(int i=2; i<=(1<<18); i++) lg[i]=lg[i/2]+1;
int z=lg[k];
for(int i=1; i<=z; i++)
for(int j=1; j<=k-(1<<(i-1)); j++)
dp[i][j]=Minim(dp[i-1][j],dp[i-1][j+(1<<(i-1))]);
for(int x,y; f>>x>>y;)
{ x=poz[x];
y=poz[y];
if(x>y)
swap(x,y);
int z=lg[y-x];
g<<e[Minim(dp[z][x],dp[z][y-(1<<z)+1])]<<'\n';
}
f.close(); g.close(); return 0;
}