Pagini recente » Cod sursa (job #2878224) | Cod sursa (job #2268588) | Cod sursa (job #969590) | Cod sursa (job #1559163) | Cod sursa (job #2585406)
#include <iostream>
#include <fstream>
#include <list>
using namespace std;
list<unsigned int> adjlist[100001];
unsigned int first[100001];
unsigned int level[100001];
bool vis[100001];
unsigned int* eul;
void dfs(unsigned int node, unsigned int& index)
{
vis[node] = true;
eul[index] = node;
first[node] = index++;
for(list<unsigned int>::iterator it = adjlist[node].begin(); it != adjlist[node].end(); it++){
if(!vis[*it]){
level[*it] = level[node] + 1;
dfs(*it, index);
eul[index++] = node;
}
}
}
unsigned int lca(unsigned int i, unsigned int j)
{
unsigned int node = i;
for(unsigned int x = first[i] + 1; x <= first[j]; x++){
if(level[eul[x]] < level[node]){
node = eul[x];
}
}
return node;
}
int main()
{
ifstream fin("lca.in");
ofstream fout("lca.out");
unsigned int n, q, i, j, child = 2;
fin >> n >> q;
eul = new unsigned int[(n << 1) - 1];
for(i = 1; i < n; i++){
fin >> j;
adjlist[child].push_back(j);
adjlist[j].push_back(child);
child++;
}
child = 0;
dfs(1, child);
while(q){
fin >> i >> j;
if(first[i] > first[j]){
child = i;
i = j;
j = child;
}
fout << lca(i, j) << '\n';
q--;
}
return 0;
}