Pagini recente » Cod sursa (job #1582490) | Cod sursa (job #1274592) | Cod sursa (job #1433416) | Cod sursa (job #2013510) | Cod sursa (job #738584)
Cod sursa(job #738584)
# include <fstream>
# include <iostream>
# include <vector>
# define DIM 100003
using namespace std;
int n, m, a[30][DIM], e[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)
{
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<=ne;++i)
if (a[p-1][a[p-1][i]])
{
if (l[a[p-1][i]]<l[a[p-1][a[p-1][i]]])
a[p][i]=a[p-1][i];
else
a[p][i]=a[p-1][a[p-1][i]];
gata=0;
}
}
}
int lca (int i, int j)
{
int p=pow+1;
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);
}
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;
}