Pagini recente » Cod sursa (job #677064) | Cod sursa (job #338989) | Cod sursa (job #609937) | Borderou de evaluare (job #2066667) | Cod sursa (job #2279600)
#include <fstream>
#include <vector>
#define DIM 100010
using namespace std;
ifstream fin ("lca.in");
ofstream fout ("lca.out");
int n,m,i,j,x,y,px,py,val,k;
vector <int> L[DIM];
int niv[DIM],v[2*DIM],poz[DIM],p[2*DIM];
pair <int,int> d[20][2*DIM];
void dfs (int nod){
v[++k] = nod;
poz[nod] = k; /// prima aparitie in parcurgerea euler
for (int i=0;i<L[nod].size();i++){
int vecin = L[nod][i];
niv[vecin] = 1 + niv[nod];
dfs (vecin);
v[++k] = nod;
}
}
int main (){
fin>>n>>m;
for (i=1;i<n;i++){
fin>>x;
L[x].push_back (i+1);
}
niv[1] = 1;
dfs (1);
/*for (i=1;i<=k;i++)
fout<<v[i]<<" ";
fout<<"\n";*/
for (i=2;i<=k;i++)
p[i] = p[i/2] + 1;
for (i=1;i<=k;i++)
d[0][i] = make_pair (niv[v[i]],i);
for (i=1;(1<<i)<=k;i++)
for (j=1;j<=k;j++){
d[i][j] = d[i-1][j];
if (j+(1<<(i-1)) <= k && d[i-1][j+(1<<(i-1))].first < d[i][j].first)
d[i][j] = d[i-1][j+(1<<(i-1))];
///d[i][j] = min (d[i-1][j],d[i-1][j+(1<<(i-1))]);
}
for (;m--;){
fin>>x>>y;
/// gasim primele pozitii in parcurgere EULER
/// solutia va fi minimul din secventa respectiva;
px = poz[x];
py = poz[y];
if (px > py)
swap (px,py);
/// minimul din seventa px.. py
val = p[py-px+1];
pair <int,int> sol = min (d[val][px],d[val][py-(1<<val)+1]);
fout<<v[sol.second]<<"\n";
}
return 0;
}