Pagini recente » Cod sursa (job #1103207) | Cod sursa (job #72970) | Cod sursa (job #345995) | Cod sursa (job #2093796) | Cod sursa (job #1729975)
#include <iostream>
#include <fstream>
#include <vector>
#include <iterator>
#define NMAX 100010
using namespace std;
vector<int> v[NMAX];
int tati[NMAX];
vector<int> euler,level;
int primaAparitie[NMAX];
void constr(int nod,int nivel,int &indice){
euler.push_back(nod);
level.push_back(nivel);
if(primaAparitie[nod]==0)
primaAparitie[nod]=indice;
indice++;
for(vector<int>::iterator it=v[nod].begin();it!=v[nod].end();it++){
constr(*it,nivel+1,indice);
euler.push_back(nod);
level.push_back(nivel);
indice++;
}
}
int main()
{
ifstream f("lca.in");
ofstream g("lca.out");
int n,m,ii,is;
int a;
int lev,ancestor;
f >> n >> m;
int indice=0;
for(int i=0;i<n-1;i++){
f >> tati[i+2];
v[tati[i+2]].push_back(i+2);
}
constr(1,0,indice);
for(int i=0;i<m;i++){
f >> ii >> is;
if(ii > is)
swap(ii,is);
if(ii == is)
g << tati[ii] << "\n";
else{
ii=primaAparitie[ii];
is=primaAparitie[is];
lev=level[ii];
ancestor=euler[ii];
while(ii <= is){
if(level[ii] < lev){
lev = level[ii];
ancestor=euler[ii];
}
ii++;
}
g << ancestor << '\n';
}
}
return 0;
}