Pagini recente » Cod sursa (job #3348669) | Cod sursa (job #3313281) | Cod sursa (job #3348688) | Cod sursa (job #956070) | Cod sursa (job #3348221)
#include <fstream>
#include <vector>
using namespace std;
ifstream in("lca.in");
ofstream out("lca.out");
int n, q;
vector<int> v[100005];
vector<pair<int, int>> qs[100005];
int tata[100005];
int dim[100005];
int ancestor[100005];
int viz[100005];
int ans[2000005];
int rad(int x)
{
if(x == tata[x])
{
return x;
}
int r = rad(tata[x]);
tata[x] = r;
return r;
}
void unire(int x, int y)
{
int rx = rad(x);
int ry = rad(y);
if(rx == ry)
{
return;
}
if(dim[ry] > dim[rx])
{
swap(rx, ry);
}
tata[ry] = rx;
dim[rx] += dim[ry];
}
void dfs(int nod, int tata)
{
viz[nod] = 1;
ancestor[nod] = nod;
for(auto it: v[nod])
{
if(it == tata)
{
continue;
}
dfs(it, nod);
unire(nod, it);
ancestor[rad(nod)] = nod;
}
for(auto it: qs[nod])
{
if(viz[it.first] == 1)
{
ans[it.second] = ancestor[rad(it.first)];
}
}
}
int main()
{
in>>n>>q;
int x, y;
for(int i = 2; i<=n; i++)
{
in>>x;
v[x].push_back(i);
}
for(int i = 1; i<=q; i++)
{
in>>x>>y;
qs[x].push_back({y, i});
qs[y].push_back({x, i});
}
for(int i = 1; i<=n; i++)
{
tata[i] = i;
dim[i] = 1;
}
dfs(1, 0);
for(int i = 1; i<=q; i++)
{
out<<ans[i]<<'\n';
}
return 0;
}