Pagini recente » Cod sursa (job #2575714) | Cod sursa (job #3252692) | Cod sursa (job #462817) | Cod sursa (job #2824424) | Cod sursa (job #1054077)
#include<fstream>
#include<vector>
using namespace std;
ifstream in("lca.in"); ofstream out("lca.out");
int t[10005],n,nr;
int p[30005], niv[300005];
int poz[10005],m,a,b;
vector <int> l[100005];
void dfs(int nod, int lev){
niv[++nr]=lev;
p[nr] =nod;
if(poz[nod]==0) poz[nod]=nr;
for(vector <int> :: iterator it=l[nod].begin();it!=l[nod].end();++it)
if(poz[(*it)]==0 && (*it)!=1){
dfs((*it),lev+1);
niv[++nr]=lev;
p[ nr]=nod;
}
}
int minim(int st, int dr){
int nivret=(1<<20), nodret=0;
for(int i=st; i<=dr;++i)
if(nivret>niv[i])
nivret=niv[i],nodret=p[i];
return nodret;
}
int main(){
in>>n>>m;
for(int i=2;i<=n;++i){
in>>t[i];
l[t[i]].push_back(i);
}
dfs(1,0);
for(;m;--m){
in>>a>>b;
out<<minim(min(poz[a],poz[b]),max(poz[a],poz[b]))<<'\n';
}
out.close();
return 0;
}