Pagini recente » Cod sursa (job #3143202) | Cod sursa (job #2447801) | Cod sursa (job #2894115) | Cod sursa (job #3267359) | Cod sursa (job #2722721)
#include <iostream>
#include <fstream>
#include <vector>
#define NMAX 100000
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
int n, q, dp[17][(1<<17)+10], nivel[NMAX+10];
vector <int> nod[NMAX+10];
void dfs(int x, int p)
{ dp[0][x] = p;
nivel[x] = nivel[p] + 1;
for(auto u : nod[x])
if(u != p)
dfs(u, x);
}
int lca(int x, int y)
{ if(nivel[x] < nivel[y]) swap(x, y);
int dif = nivel[x] - nivel[y];
for(int bit=0; (1<<bit)<=dif; bit++)
if(dif & (1 << bit))
x = dp[bit][x];
if(x == y)
return x;
for(int bit=16; bit>=0; bit--)
if(dp[bit][x] != dp[bit][y])
{ x = dp[bit][x];
y = dp[bit][y];
}
return dp[0][x];
}
int main()
{
fin >> n >> q;
for(int i=2; i<=n; i++)
{ int x;
fin >> x;
nod[x].push_back(i);
}
dfs(1, 0);
for(int bit=1; (1<<bit)<=n; bit++)
for(int i=1; i<=n; i++)
dp[bit][i] = dp[bit-1][dp[bit-1][i]];
while(q--)
{ int x, y;
fin >> x >> y;
fout << lca(x, y) << '\n';
}
return 0;
}