Pagini recente » Borderou de evaluare (job #723213) | Borderou de evaluare (job #634905) | Borderou de evaluare (job #180149) | Cod sursa (job #100618) | Cod sursa (job #2412378)
#include <fstream>
#include <vector>
#define DIM 200010
using namespace std;
ifstream fin ("lca.in");
ofstream fout ("lca.out");
int n,m,i,j,nr,x,y,k,pozx,pozy;
vector <int> L[DIM];
int first[DIM],N[DIM],E[DIM],viz[DIM],p[DIM];
pair <int,int> d[32][DIM];
void dfs (int nod, int niv){
viz[nod] = 1;
N[nod] = niv;
E[++k] = nod;
first[nod] = k;
for (int i=0;i<L[nod].size();i++){
int vecin = L[nod][i];
if (!viz[vecin]){
dfs (vecin,niv+1);
E[++k] = nod;
}
}
}
int main (){
fin>>n>>m;
for (i=1;i<n;i++){
fin>>x;
L[x].push_back(i+1);
}
dfs (1,1);
for (i=2;i<=k;i++)
p[i] = p[i/2]+1;
for (i=1;i<=k;i++)
d[0][i] = make_pair(N[E[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;
pozx = first[x], pozy = first[y];
if (pozx > pozy)
swap (pozx,pozy);
nr = p[pozy-pozx+1];
pair <int,int> sol = min(d[nr][pozx],d[nr][pozy-(1<<nr)+1]);
fout<<E[sol.second]<<"\n";
}
return 0;
}