Pagini recente » Cod sursa (job #1480572) | Cod sursa (job #268228) | Cod sursa (job #2553448) | Cod sursa (job #1858179) | Cod sursa (job #1116533)
#include <fstream>
#include <vector>
#include <bitset>
#define Nmax 100099
using namespace std;
ifstream f("lca.in");
ofstream g("lca.out");
int N,M,E[2*Nmax],L[Nmax],F[Nmax],lg[2*Nmax],RMQ[18][Nmax],x,y;
vector < int > G[Nmax];
bitset < Nmax > viz;
void ReadInput()
{
f>>N>>M;
for(int i=2;i<=N;++i)
{
int x;
f>>x;
G[x].push_back(i);
}
}
void DFS(int node,int level)
{
viz[node]=1;
E[++E[0]]=node , F[node]=E[0];
L[node]=level;
for(vector<int>::iterator it=G[node].begin();it!=G[node].end();++it)
if(!viz[*it])
{
DFS(*it,level+1);
E[++E[0]]=node;
//L[E[0]]=level;
}
}
void MakeRMQ()
{
for(int i=2;i<=E[0];++i)lg[i]=lg[i/2]+1;
for(int j=1;j<=E[0];++j)RMQ[0][j]=E[j];
for(int i=1; (1<<i)<=E[0];++i)
for(int j=1;j<=E[0]-(1<<i)+1;++j)
{
int x=RMQ[i-1][j] , y=RMQ[i-1][j+(1<<(i-1))];
if(!x)RMQ[i][j]=y;
if(!y)RMQ[i][j]=x;
if(x*y)
if(L[x]<L[y])RMQ[i][j]=x;
else RMQ[i][j]=y;
}
}
int LCA(int x,int y)
{
int st=F[x] ,dr=F[y];
if(st>dr)swap(st,dr);
int log=lg[dr-st+1];
int x1=RMQ[log][st] , x2=RMQ[log][dr-(1<<log)+1];
if(!x1)return x2;
if(!x2)return x1;
if(L[x1]<L[x2])return x1;
else return x2;
}
int main()
{
ReadInput();
DFS(1,1);
MakeRMQ();
for(int i=1;i<=M;++i)
f>>x>>y , g<<LCA(x,y)<<'\n';
f.close();g.close();
return 0;
}