Pagini recente » Cod sursa (job #1562826) | Cod sursa (job #2326411) | Cod sursa (job #1053876) | Cod sursa (job #1640212) | Cod sursa (job #3322936)
/// patratele
#include <bits/stdc++.h>
using namespace std;
#define MOD 9901
ifstream fin("lca.in");
ofstream fout("lca.out");
int i, vf, oi[200010], level[200010], rmq[200010][100], fir[100010], n, m, x, j, y, fr1, fr2;
vector<int> v[100010];
void dfs(int x, int lvl)
{
oi[++vf] = x;
level[vf] = lvl;
rmq[vf][0] = vf;
if (fir[x] == 0)
fir[x] = vf;
for (auto it : v[x])
{
dfs(it, lvl + 1);
oi[++vf] = x;
level[vf] = lvl;
rmq[vf][0] = vf;
}
}
int rez(int st, int dr)
{
int l = dr - st + 1;
int ll = log2(l);
if (level[rmq[st][ll]] < level[rmq[dr - (1 << ll) + 1][ll]])
return oi[rmq[st][ll]];
else
return oi[rmq[dr - (1 << ll) + 1][ll]];
}
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
fin >> n >> m;
for (i = 2; i <= n; i++)
{
fin >> x;
v[x].push_back(i);
}
dfs(1,0);
for (i = 1; (1 << i) <= vf; i++)
for (j = 1; j <= (vf - (1 << i))+1; j++)
{
rmq[j][i] = rmq[j][i - 1];
if (level[rmq[j][i - 1]] > level[rmq[j + (1 << (i - 1))][i - 1]])
rmq[j][i]=rmq[j + (1 << (i - 1))][i - 1];
}
for (i = 1; i <= m; i++)
{
fin >> x >> y;
fr1 = fir[x];
fr2 = fir[y];
if (fr1 > fr2)
swap(fr1, fr2);
fout << rez(fr1, fr2)<<'\n';
}
return 0;
}