Pagini recente » Cod sursa (job #630504) | Cod sursa (job #2326600) | Cod sursa (job #2707475) | Cod sursa (job #457623) | Cod sursa (job #923370)
Cod sursa(job #923370)
#include<fstream>
#include<vector>
#define NMAX 100005
using namespace std;
ifstream f("lca.in");
ofstream g("lca.out");
int N,Q,x,viz[NMAX],nr,fst[NMAX],M[NMAX*2][18],a,b,aux,lg2[2*NMAX];
vector<int> L[NMAX];
struct{ int nod,lvl;}euler[2*NMAX];
void df(int x,int k)
{
nr++;
euler[nr].nod=x;
euler[nr].lvl=k;
fst[x]=nr;
for (int i=0;i<L[x].size();i++)
if (!viz[L[x][i]])
{
viz[ L[x][i] ]=1;
df(L[x][i],k+1);
nr++;
euler[nr].nod=x;
euler[nr].lvl=k;
}
}
void pre()
{
for (int i=1;i<=nr;i++)
M[i][0]=i;
for (int j=1;(1<<j)<=nr;j++)
for (int i=1;i<=nr-(1<<j)+1;i++)
if (euler[ M[i][j-1] ].nod < euler[ M[i+(1<<j-1)][j-1] ].nod)
M[i][j]=M[i][j-1];
else
M[i][j]=M[i+(1<<j-1)][j-1];
for (int i=2;i<=nr;i++)
lg2[i]=lg2[i/2]+1;
}
int main()
{
f>>N>>Q;
for (int i=1;i<=N-1;i++)
{
f>>x;
L[x].push_back(i+1);
}
df(1,0);
pre();
for (int i=1;i<=Q;i++)
{
f>>a>>b;
a=fst[a];
b=fst[b];
if (b<a) {aux=a; a=b; b=aux;}
int k=b-a+1;
k=lg2[k];
g<<min(euler[M[a][k]].nod,euler[M[b-(1<<k)+1][k]].nod)<<'\n';
}
return 0;
}