Pagini recente » Cod sursa (job #1319795) | Cod sursa (job #298872) | Cod sursa (job #1087950) | Cod sursa (job #3005303) | Cod sursa (job #3005215)
#include <fstream>
#include <vector>
#define DIM 100001
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
int n,q,t,nr,x,y,poz[DIM],e[2*DIM];
vector<int> l[DIM];
struct elem {
int nod,niv;
}r[25][2*DIM];
void dfs(int nod,int niv) {
r[0][++nr]={nod,niv};
poz[nod]=nr;
for (int i=0;i<l[nod].size();i++) {
int vec=l[nod][i];
dfs(vec,niv+1);
r[0][++nr]={nod,niv};
}
}
void rmq() {
for (int p=1;(1<<p)<=nr;p++)
for (int i=1;i<=nr;i++) {
r[p][i]=r[p-1][i];
int j=i+(1<<(p-1));
if (j<=nr && r[p-1][j].niv<r[p][i].niv)
r[p][i]=r[p-1][j];
}
e[1]=0;
for (int i=2;i<=nr;i++)
e[i]=e[i/2]+1;
}
int lca(int x,int y) {
x=poz[x];
y=poz[y];
if (x>y)
swap(x,y);
int k=e[y-x+1];
int l=(1<<k);
if (r[k][x].niv<r[k][y-l+1].niv)
return r[k][x].nod;
return r[k][y-l+1].nod;
}
int main() {
fin>>n>>q;
for (int i=2;i<=n;i++) {
fin>>t;
l[t].push_back(i);
}
dfs(1,0);
rmq();
while (q--) {
fin>>x>>y;
fout<<lca(x,y)<<"\n";
}
return 0;
}