Pagini recente » Cod sursa (job #2526083) | Cod sursa (job #2481586) | Cod sursa (job #499968) | Cod sursa (job #1257149) | Cod sursa (job #2368497)
#include <fstream>
#define nmax 100005
#include <vector>
#include <cmath>
using namespace std;
ifstream f("lca.in");
ofstream g("lca.out");
vector <int> v[nmax];
int viz[nmax],niv[nmax],use[nmax],n,k,i,dim,j,x,y,nr,v1[nmax],m[2*nmax][22],l;
void df(int i,int nv)
{
dim++;
v1[dim]=i;
use[i]=1;
niv[dim]=nv;
if(!viz[i]) viz[i]=dim;
for(int j=0;j<v[i].size();j++)
if(!use[v[i][j]]) {df(v[i][j],nv+1);
v1[++dim]=i;
niv[dim]=nv;}
}
int main()
{
f>>n>>k;
for(i=2;i<=n;i++)
{
f>>x;
v[x].push_back(i);
v[i].push_back(x);
}
df(1,0);
v1[++dim]=1;
for(i=1;i<=dim;i++) m[i][0]=i;
for(j=1;(1<<j)<=dim;j++)
for(i=1;i<=dim-(1<<j)+1;i++)
if(niv[m[i][j-1]]<=niv[m[i+(1<<(j-1))][j-1]]) m[i][j]=m[i][j-1];
else m[i][j]=m[i+(1<<(j-1))][j-1];
for(i=1;i<=k;i++)
{
f>>x>>y;
if(viz[x]>viz[y]) swap(x,y);
l=log2(viz[y]-viz[x]+1);
if(niv[m[viz[x]][l]]<niv[m[viz[y]-(1<<l)+1][l]]) g<<v1[m[viz[x]][l]]<<'\n';
else g<<v1[m[viz[y]-(1<<l)+1][l]]<<'\n';
}
return 0;
}