Pagini recente » Cod sursa (job #2752283) | Cod sursa (job #1614980) | Cod sursa (job #1284872) | Cod sursa (job #1638614) | Cod sursa (job #2392495)
#include <fstream>
#include <vector>
#define nmax 100005
#include <cmath>
using namespace std;
ifstream f("lca.in");
ofstream g("lca.out");
vector <int> v[nmax];
int i,j,nr,x,n,q,niv[2*nmax],vct[2*nmax],fr[nmax],m[2*nmax][20],a,b;
void df(int nod,int nvl)
{
int i,vec;
nr++;
niv[nr]=nvl;
vct[nr]=nod;
if(!fr[nod]) fr[nod]=nr;
for(i=0;i<v[nod].size();++i)
{
vec=v[nod][i];
df(vec,nvl+1);
nr++;
niv[nr]=nvl;
vct[nr]=nod;
}
}
int main()
{
f>>n>>q;
for(i=2;i<=n;i++)
{
f>>x;
v[x].push_back(i);
}
df(1,0);
for(i=1;i<=nr;++i) m[i][0]=i;
for(j=1;(1<<j)<=nr;++j)
for(i=1;i+(1<<j)+1<=nr;++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<=q;i++)
{
f>>a>>b;
a=fr[a];
b=fr[b];
if(a>b) swap(a,b);
x=log2(b-a+1);
if(niv[m[a][x]]<niv[m[b-(1<<x)+1][x]]) g<<vct[m[a][x]]<<'\n';
else g<<vct[m[b-(1<<x)+1][x]]<<'\n';
}
return 0;
}