Pagini recente » Cod sursa (job #2652205) | Cod sursa (job #3262050) | Cod sursa (job #1795237) | Cod sursa (job #1015708) | Cod sursa (job #3181895)
#include <bits/stdc++.h>
using namespace std;
ifstream fin ("lca.in");
ofstream fout ("lca.out");
const int maxDim = 1e5 + 5;
int T[maxDim] , ancestor[maxDim] , N , Q;
bool visited[maxDim];
vector <int> adList[maxDim] , q[maxDim];
vector <pair <int , int>> v;
map <pair<int , int> , int> Queries;
int Find (int N)
{
if(T[N] != N)
T[N] = Find(T[N]);
return T[N];
}
void Union (int A , int B)
{
int rA = Find(A) , rB = Find(B);
if(rA != rB)
T[rA] = rB;
}
void TarjanLCA (int Node)
{
visited[Node] = 1;
ancestor[Node] = Node;
for(auto U : adList[Node])
if(!visited[U])
{
TarjanLCA(U);
Union(Node , U);
ancestor[Find(Node)] = Node;
}
for(int U : q[Node])
if(visited[U])
Queries[{Node , U}] = ancestor[Find(U)];
}
int main()
{
fin >> N >> Q;
for(int i = 1; i <= N; ++i)
T[i] = i;
for(int i = 2; i <= N; ++i)
{
int X;
fin >> X;
adList[X].push_back(i);
adList[i].push_back(X);
}
for(int i = 1; i <= Q; ++i)
{
int X , Y;
fin >> X >> Y;
// cout << X << " " << Y << endl;
v.push_back({X , Y});
q[X].push_back(Y);
q[Y].push_back(X);
}
TarjanLCA(1);
for(auto X : v)
{
int a = min(X.first , X.second);
int b = max(X.first , X.second);
fout << max(Queries[{X.first , X.second}],
Queries[{X.second,X.first}]) << '\n';
}
}