Pagini recente » Cod sursa (job #2759885) | Cod sursa (job #990800) | Cod sursa (job #1979575) | Cod sursa (job #586872) | Cod sursa (job #2432112)
#include <iostream>
#include <fstream>
#include <vector>
#define maxN 100001
using namespace std;
int min(int a, int b)
{
if (a < b)
return a;
return b;
}
void DFS(vector<int> adjlist[], int node, int level, bool *visited, vector<int> &levels, vector<int> &path)
{
visited[node] = true;
path.push_back(node);
levels.push_back(level);
for(int i : adjlist[node])
if (visited[i] == false)
{
DFS(adjlist, i, level + 1, visited, levels, path);
path.push_back(node);
levels.push_back(level);
}
}
int LCA(vector<int> levels, vector<int> path, int param1, int param2)
{
int ok = 0;
int index = -1;
int minim = levels.size() + 1;
int goodIndex = -1;
int i;
for (i = 0; i < path.size(); i++)
{
if (path.at(i) == param1)
{
ok = 1;
index = i;
break;
}
else if (path.at(i) == param2)
{
ok = 2;
index = i;
break;
}
}
for (i = index; i < path.size(); i++)
{
minim = min(minim, levels.at(i));
if (minim == levels.at(i))
{
goodIndex = i;
}
if (ok == 2 && path.at(i) == param1)
break;
if (ok == 1 && path.at(i) == param2)
break;
}
return path.at(goodIndex);
}
int main(int argc, char const *argv[])
{
ifstream read("lca.in");
ofstream write("lca.out");
int N, M;
bool visited[maxN];
vector<int> adjlist[maxN];
vector<int> levels;
vector<int> path;
read >> N >> M;
int father;
for(int i = 2; i <= N; ++i)
{
read >> father;
adjlist[father].push_back(i);
}
DFS(adjlist, 1, 0, visited, levels, path);
int param1, param2;
for (int i = 0; i < M ; i++)
{
read >> param1 >> param2;
write << LCA(levels, path, param1, param2) << "\n";
}
read.close();
write.close();
return 0;
}