Pagini recente » Cod sursa (job #1241932) | Cod sursa (job #2297257) | Cod sursa (job #1503072) | Cod sursa (job #1483233) | Cod sursa (job #1249836)
#include <fstream>
#include <vector>
#include <algorithm>
using namespace std;
#define NMax 100005
#define LGMax 18
ifstream f("lca.in");
ofstream g("lca.out");
int n,m,lgn,N;
vector<int> v[NMax];
bool viz[NMax];
int gr[NMax],P[NMax];
int RMQ[NMax*2][LGMax];
void DFS(int s)
{
viz[s]=1;
for(int i=0;i<v[s].size();++i) if(!viz[v[s][i]])
{
gr[v[s][i]]=gr[s]+1;
RMQ[++N][0]=s;
DFS(v[s][i]);
}
RMQ[++N][0]=s;
P[s]=N;
}
void build()
{
int x;
for(int aux=1;aux<=N;aux<<=1) lgn++;
for(int j=1;j<=lgn;++j) for(int i=1;i<=N;++i)
{
x=i+(1<<(j-1));
if(x>N) RMQ[i][j]=RMQ[i][j-1];
else
{
if( gr[RMQ[i][j-1]] < gr[RMQ[x][j-1]] ) RMQ[i][j]=RMQ[i][j-1];
else RMQ[i][j]=RMQ[x][j-1];
}
}
}
int main()
{
int i,a,b,p,aux;
f>>n>>m;
for(i=2;i<=n;++i)
{
f>>a;
v[a].push_back(i);
}
DFS(1);
build();
while(m--)
{
f>>a>>b;
a=P[a], b=P[b];
if(a>b) swap(a,b);
for(p=-1,aux=1;aux<=b-a+1;aux<<=1) p++;
if( gr[RMQ[a][p]] < gr[RMQ[b-(1<<p)+1][p]] ) g<<RMQ[a][p]<<"\n";
else g<<RMQ[b-(1<<p)+1][p]<<"\n";
}
f.close();
g.close();
return 0;
}