Pagini recente » Cod sursa (job #2052366) | Cod sursa (job #1663227) | Cod sursa (job #2098020) | Cod sursa (job #1412816) | Cod sursa (job #2121128)
#include <iostream>
#include <fstream>
#include <vector>
#include <bitset>
#include <queue>
#define MAX 100001
using namespace std;
int n, m, T[MAX], deep[MAX];
vector < int > v[MAX];
queue < int > q;
bitset < MAX > viz;
ifstream f("lca.in");
ofstream g("lca.out");
void dfs()
{
q.push(1);
while(!q.empty())
{
int node = q.front();
q.pop();
if(viz[node]==0)
{
viz[node]=1;
for(size_t i=0; i<v[node].size(); i++)
{
deep[v[node][i]]=deep[node]+1;
q.push(v[node][i]);
}
}
}
}
int lca(int n1, int n2)
{
while(deep[n1]>deep[n2])
n1=T[n1];
while(deep[n2]>deep[n1])
n2=T[n2];
while(deep[n2]==deep[n1] && n1!=n2)
{
n2=T[n2];
n1=T[n1];
}
return n1;
}
void read()
{
f>>n>>m;
for(int i=2; i<=n; i++)
{
f>>T[i];
v[T[i]].push_back(i);
// v[i].push_back(T[i]);
}
deep[1]=1;
dfs();
/*for(int i=1; i<=n; i++)
cout<<deep[i]<<" ";
cout<<endl;*/
int x, y;
for(int i=1; i<=m; i++)
{
f>>x>>y;
g<<lca(x, y)<<'\n';
}
}
int main()
{
read();
}