Pagini recente » Cod sursa (job #24273) | Cod sursa (job #2979577) | Cod sursa (job #1422671) | Cod sursa (job #1080015) | Cod sursa (job #739605)
Cod sursa(job #739605)
# include <fstream>
# include <iostream>
# include <vector>
# define DIM 100003
using namespace std;
int n, m, a[30][2*DIM], e[2*DIM], fs[DIM], l[DIM], ne, pow;
vector<int>G[DIM];
void df (int k)
{
e[++ne]=k;
fs[k]=ne;
a[0][ne]=k;
for(vector<int>::iterator I=G[k].begin();I!=G[k].end();++I)
{
l[*I]=l[k]+1;
df(*I);
e[++ne]=k;
a[0][ne]=k;
}
}
void init ()
{
int gata=0, p=1;
while(!gata)
{
++pow;
gata=1;
for(int i=1;i+(1<<p)-1<=ne;++i)
{
if (l[a[p-1][i]]<l[a[p-1][i+(1<<(p-1))]])
a[p][i]=a[p-1][i];
else
a[p][i]=a[p-1][i+(1<<(p-1))];
gata=0;
}
++p;
}
}
int lca (int i, int j)
{
int p=pow;
while(i+(1<<p)>j)
--p;
if (l[a[p][i]]<l[a[p][j-(1<<p)+1]])
return a[p][i];
return a[p][j-(1<<p)+1];
}
int main ()
{
ifstream fin ("lca.in");
ofstream fout ("lca.out");
fin>>n>>m;
int x, y;
for(int i=1;i<n;++i)
{
fin>>x;
G[x].push_back(i+1);
}
l[1]=1;
df (1);
init();
for(;m--;)
{
fin>>x>>y;
if (fs[x]<fs[y])
fout<<lca(fs[x], fs[y])<<"\n";
else
fout<<lca(fs[y], fs[x])<<"\n";
}
return 0;
}