Pagini recente » Cod sursa (job #3292850) | Cod sursa (job #1584009) | Statisticile problemei Lautari | Cod sursa (job #143829) | Cod sursa (job #3288119)
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#include <algorithm>
#include <map>
using namespace std;
ifstream f("lca.in");
ofstream g("lca.out");
const int NMAX = 100005;
map<pair<int, int>, int> queries;
int n, m;
vector<int> graph[NMAX];
int parent[NMAX];
int adj[NMAX];
int viz[NMAX];
int stram[NMAX];
int find(int x) {
if (parent[x] != x) {
parent[x] = find(parent[x]);
}
return parent[x];
}
void unionSet(int x, int y) {
int rootX = find(x);
int rootY = find(y);
if (rootX != rootY) {
parent[rootY] = rootX;
}
}
void tarjan(int nod)
{
viz[nod] = 1;
stram[nod] = nod;
for (int v : graph[nod])
{
if (!viz[v])
{
tarjan(v);
unionSet(nod, v);
stram[find(nod)] = nod;
}
}
for (auto it : queries)
{
if (it.first.first == nod && viz[it.first.second])
{
queries[it.first] = stram[find(it.first.second)];
}
else if (it.first.second == nod && viz[it.first.first])
{
queries[it.first] = stram[find(it.first.first)];
}
}
}
int main()
{
f >> n >> m;
parent[1] = 1;
for (int i = 2; i <= n; i++)
{
f >> adj[i];
graph[adj[i]].push_back(i);
graph[i].push_back(adj[i]);
parent[i] = i;
}
for (int i = 1; i <= m; i++)
{
int x, y;
f >> x >> y;
queries[{x, y}] = 0;
}
tarjan(1);
for(auto it = queries.crbegin(); it != queries.crend() ;it++)
{
g << it -> second << '\n';
}
return 0;
}