Pagini recente » Cod sursa (job #2451288) | Cod sursa (job #1404038) | Cod sursa (job #2503886) | Cod sursa (job #1120403) | Cod sursa (job #3221298)
#include <fstream>
#include <vector>
using namespace std;
ifstream in("lca.in");
ofstream out("lca.out");
const int NMAX = 1e5 + 5;
const int MMAX = 2e6 + 5;
vector <int> Edges[NMAX];
vector <pair < int, int >> Queries[NMAX];
int N, M, Father[NMAX], Results[MMAX];
bool Visited[NMAX];
void make_set(int x)
{
Father[x] = x;
}
int find_set(int x)
{
if (Father[x] == x)
return x;
return Father[x] = find_set(Father[x]);
}
void union_sets(int x, int y)
{
x = find_set(x);
y = find_set(y);
if (x != y)
Father[y] = x;
}
void DFS(int x)
{
make_set(x);
Visited[x] = true;
for(int it : Edges[x])
{
if (!Visited[it])
{
DFS(it);
union_sets(x, it);
Father[find_set(x)] = x;
}
}
for(pair < int, int > it : Queries[x])
{
if (Visited[it.first])
Results[it.second] = Father[find_set(it.first)];
}
}
int main()
{
int x, y;
in >> N >> M;
for(int i = 2; i <= N; i++)
{
in >> x;
Edges[x].push_back(i);
}
for(int i = 1; i <= M; i++)
{
in >> x >> y;
Queries[x].push_back({y, i});
Queries[y].push_back({x, i});
}
DFS(1);
for(int i = 1; i <= M; i++)
out << Results[i] << '\n';
return 0;
}