Pagini recente » Cod sursa (job #198374) | Cod sursa (job #450405) | Cod sursa (job #2726703) | Cod sursa (job #701145) | Cod sursa (job #2503857)
#include <fstream>
#include <vector>
using namespace std;
ifstream cin("lca.in");
ofstream cout("lca.out");
int rng[200005], n, e[200005], first[100005], rmqq[20][200005], log2[200005], cnt=1;
vector<int> v[100005];
void dfs(int nod, int dpt){
e[cnt]=nod;
rng[cnt]=dpt;
first[nod]=cnt;
cnt++;
for (int i=0; i<v[nod].size(); i++)
{
dfs(v[nod][i], dpt+1);
e[cnt]=nod;
rng[cnt]=dpt;
cnt++;
}
}
int main()
{
int m, a, i, j, s, p, q, k, rez, b, t;
cin >> n >> m;
for (i=2; i<=n; i++){
cin >> a;
v[a].push_back(i);
}
dfs(1, 0);
log2[1]=0;
for (i=2; i<=cnt; i++)
log2[i]=log2[i>>1]+1;
cnt--;
for (i=1; i<=cnt; i++)
rmqq[0][i]=i;
for (i=1; (1<<i)<cnt; i++)
for (j=1; j<=cnt-(1<<i); j++)
{
rmqq[i][j]=rmqq[i-1][j];
if (rng[rmqq[i-1][j]]>rng[rmqq[i-1][j+(1<<(i-1))]])
rmqq[i][j]=rmqq[i-1][j+(1<<(i-1))];
}
for (i=1; i<=m; i++)
{
cin >>a >> b;
p=min(first[a], first[b]);
q=max(first[a], first[b]);
k=q-p+1;
t=log2[k];
rez=rmqq[t][p];
if (rng[rmqq[t][p]]>rng[rmqq[t][q-(1<<t)+1]])
rez=rmqq[t][q-(1<<t)+1];
cout << e[rez] << '\n';
}
return 0;
}