Pagini recente » Cod sursa (job #2055388) | Cod sursa (job #306312) | Cod sursa (job #93660) | Cod sursa (job #1538028) | Cod sursa (job #2973015)
#include <fstream>
#include <vector>
#define NMAX 100001
#define DIM 2*NMAX
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
int n,q,t,x,y,nr,poz[DIM],e[DIM];
struct elem {
int nod,niv;
}r[20][DIM];
vector<int> l[NMAX];
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};
}
}
int lca(int x,int y) {
int p1=poz[x];
int p2=poz[y];
if (p1>p2)
swap(p1,p2);
int k=e[p2-p1+1];
int l=(1<<k);
if (r[k][p1].niv<r[k][p2-l+1].niv)
return r[k][p1].nod;
else
return r[k][p2-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);
for (int p=1;(1<<p)<=n;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;
while (q--) {
fin>>x>>y;
fout<<lca(x,y)<<"\n";
}
return 0;
}