Pagini recente » Cod sursa (job #1253362) | Cod sursa (job #2738807) | Cod sursa (job #2460217) | Cod sursa (job #2291524) | Cod sursa (job #1966933)
#include <iostream>
#include <fstream>
#include <queue>
#include <vector>
using namespace std;
ifstream in("lca.in");
ofstream out("lca.out");
#define pb push_back
const int NMax = 1e5 + 5;
const int EMax = 2 * NMax;
const int logMax = 20;
const int inf = 2e9 + 5;
int N,M,nrEuler;
int dad[NMax],depth[NMax],poz[NMax],euler[EMax],rmq[EMax][logMax],lg[EMax];
vector<int> v[NMax];
void dfs(int,int);
int main() {
in>>N>>M;
for (int i=2;i<=N;++i) {
in>>dad[i];
v[dad[i]].pb(i);
}
dfs(1,0);
lg[1] = 0;
rmq[1][0] = euler[1];
for (int i=2;i<=nrEuler;++i) {
lg[i] = lg[i/2] + 1;
rmq[i][0] = euler[i];
}
for (int p=1; (1<<p) <= nrEuler;++p) {
for (int i=1;i + (1<<p) - 1 <= nrEuler;++i) {
int nod1 = rmq[i][p-1],
nod2 = rmq[i+(1<<(p-1))][p-1],
val = (depth[nod1] < depth[nod2]) ? nod1 : nod2;
rmq[i][p] = val;
}
}
while (M--) {
int x,y;
in>>x>>y;
if (poz[x] > poz[y]) {
swap(x,y);
}
x = poz[x];
y = poz[y];
int pw = lg[y-x+1],
nod1 = rmq[x][pw],
nod2 = rmq[y - (1<<pw) + 1][pw],
val = (depth[nod1] < depth[nod2]) ? nod1 : nod2;
out<<val<<'\n';
}
in.close();out.close();
return 0;
}
void dfs(int nod,int dad) {
depth[nod] = depth[dad] + 1;
euler[++nrEuler] = nod;
poz[nod] = nrEuler;
for (int k=0;k < (int)v[nod].size();++k) {
int next = v[nod][k];
if (depth[next]) {
continue;
}
dfs(next,nod);
euler[++nrEuler] = nod;
}
}