Pagini recente » Cod sursa (job #149285) | Cod sursa (job #1727148) | Cod sursa (job #1913893) | Cod sursa (job #1092512) | Cod sursa (job #3003323)
#pragma GCC optimize("O2")
#include <fstream>
#include <vector>
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
const int NMAX = 100005;
int tata[NMAX],nivel[NMAX];
vector<int>G[NMAX];
int n,m;
void dfs(int nod, int niv)
{
nivel[nod] = niv;
for(auto x : G[nod])
dfs(x,niv+1);
}
int lca(int x, int y)
{
if(nivel[x] < nivel[y])
swap(x,y);
while(nivel[x] > nivel[y])
x = tata[x];
while(x!=y)
{
x = tata[x];
y = tata[y];
}
return x;
}
int main()
{
int i,x,y;
fin >> n >> m;
for(i=2;i<=n;++i)
{
fin >> tata[i];
G[tata[i]].push_back(i);
}
dfs(1,1);
for(i=1;i<=m;++i)
{
fin >> x >> y;
fout << lca(x,y) << '\n';
}
return 0;
}