Pagini recente » Cod sursa (job #905869) | Cod sursa (job #1204356) | Cod sursa (job #1168250) | Cod sursa (job #3129973) | Cod sursa (job #2084854)
#include <bits/stdc++.h>
#define DM 100005
#define pb push_back
#define pii pair<int,int>
#define x first
#define y second
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
int n,m,a,b;
vector<int>fiu[DM];
int niv[DM];
int parinte[DM],lastAp[DM];
vector<pii>lin;
void lca(int a,int b){
bool isA=0,isB=0;
int bestAnc=(niv[a]<niv[b]?a:b),bestNiv=min(niv[a],niv[b]);
for(auto i:lin){
if(isA || isB)
bestAnc = (i.y<bestNiv?i.x:bestAnc),
bestNiv = min(bestNiv,i.y);
if(i.x==a){
if(!isA) isA=1;
if(isB){
fout<<bestAnc<<'\n';
return;
}
}
else if(i.x==b){
if(!isB) isB=1;
if(isA){
fout<<bestAnc<<'\n';
return;
}
}
}
}
void dfs(int nod,int level){
lin.pb({nod,level});
niv[nod]=level;
for(auto i:fiu[nod])
dfs(i,level+1),
lin.pb({nod,level});
lin.pb({nod,level});
}
int main()
{
fin>>n>>m;
for(int i=2;i<=n;++i){
fin>>a;
fiu[a].pb(i);
}
dfs(1,1);
for(auto i:lin){
//fout<<i.x<<" "<<i.y<<'\n';
}
for(int i=1;i<=m;++i){
fin>>a>>b;
lca(a,b);
}
return 0;
}