Pagini recente » Cod sursa (job #2496461) | Cod sursa (job #2299906) | Cod sursa (job #2185582) | Cod sursa (job #1841226) | Cod sursa (job #751273)
Cod sursa(job #751273)
#include <fstream>
#include <vector>
using namespace std;
const char InFile[]="lca.in";
const char OutFile[]="lca.out";
const int MaxN=100111;
ifstream fin(InFile);
ofstream fout(OutFile);
int N,M,x,y,niv[MaxN],lant[MaxN],tata_lant[MaxN],g[MaxN];
vector<int> A[MaxN];
void DFS(int nod)
{
g[nod]=1;
if(A[nod].empty())
{
lant[nod]=++lant[0];
return;
}
int gmax=0;
for(vector<int>::iterator it=A[nod].begin();it!=A[nod].end();++it)
{
int vcn=*it;
niv[vcn]=niv[nod]+1;
DFS(vcn);
tata_lant[lant[vcn]]=nod;
g[nod]+=g[vcn];
if(g[gmax]<g[vcn])
{
gmax=vcn;
}
}
lant[nod]=lant[gmax];
}
inline int LCA(int x, int y)
{
while(lant[x]!=lant[y])
{
if(niv[tata_lant[lant[x]]]>niv[tata_lant[lant[y]]])
{
x=tata_lant[lant[x]];
}
else
{
y=tata_lant[lant[y]];
}
}
if(niv[x]<niv[y])
{
return x;
}
return y;
}
int main()
{
fin>>N>>M;
for(register int i=2;i<=N;++i)
{
fin>>x;
A[x].push_back(i);
}
niv[1]=1;
DFS(1);
tata_lant[lant[1]]=0;
for(register int i=1;i<=M;++i)
{
fin>>x>>y;
fout<<LCA(x,y)<<"\n";
}
fin.close();
fout.close();
return 0;
}