Pagini recente » Borderou de evaluare (job #2327579) | Rezultatele filtrării | Cod sursa (job #1079202) | Atasamentele paginii Profil yubar3tzu | Cod sursa (job #3228709)
#pragma GCC optimize("O3")
#pragma GCC optimize("fast-math")
#pragma GCC optimize("unroll-loops")
#include<bits/stdc++.h>
#define dim 100005
using namespace std;
int n, queries, v[dim], a, b, rmq[20][dim], k, in[2 * dim], out[2 * dim], ct;
vector<int>noduri[dim];
void dfs(int nod)
{
in[nod] = ++ct;
for(auto it : noduri[nod])
{
dfs(it);
}
out[nod] = ++ct;
}
bool stramos(int x, int y)
{
return (in[x] <= in[y] && out[x] >= out[y]);
}
int lcab(int x, int y)
{
if(stramos(x, y))
{
return x;
}
if(stramos(y, x))
{
return y;
}
for(int j = k; j >= 0; --j)
{
if(rmq[j][x] && !stramos(rmq[j][x], y))
{
x = rmq[j][x];
}
}
return rmq[0][x];
}
ifstream fin("lca.in");
ofstream fout("lca.out");
int32_t main(int argc, char * argv[])
{
fin >> n >> queries;
k = 18;
for(int i = 2; i <= n; ++i)
{
fin >> v[i];
noduri[v[i]].push_back(i);
rmq[0][i] = v[i];
}
dfs(1);
for(int j = 1; j <= k; ++j)
{
for(int i = 1; i <= n; ++i)
{
rmq[j][i] = rmq[j - 1][rmq[j - 1][i]];
}
}
while(queries--)
{
fin >> a >> b;
fout << lcab(a, b) << '\n';
}
return 0;
}