Pagini recente » Cod sursa (job #559566) | Cod sursa (job #1491122) | Cod sursa (job #12998) | Cod sursa (job #2721818) | Cod sursa (job #2113480)
#include <fstream>
#include <math.h>
#include <vector>
#define nmax 100005
using namespace std;
ifstream f("lca.in");
ofstream g("lca.out");
vector <int> v[nmax];
int q[nmax*2][30],p[30],vf,l[nmax*2],ap[nmax],eu[nmax*2];
void euler(int i,int lev)
{
for(int j=0;j<v[i].size();j++)
{
vf++;
eu[vf]=v[i][j];
ap[v[i][j]]=vf;
l[vf]=lev+1;
euler(v[i][j],lev+1);
eu[++vf]=i;
l[vf]=lev;
}
}
int main()
{
int n,m,i,j,x,y;
f>>n>>m;
for(i=2;i<=n;i++)
{
f>>x;
v[x].push_back(i);
}
l[1]=0;
ap[1]=1;
eu[1]=1;
vf=1;
euler(1,0);
p[0]=1;
for(i=0;p[i]<=vf;i++)
p[i+1]=p[i]*2;
for(i=1;i<=vf;i++)
q[i][0]=i;
for(j=1;p[j]<=vf;j++)
for(i=0;i+p[j-1]<=vf;i++)
{
q[i][j]=q[i][j-1];
if(l[q[i][j-1]]>l[q[i+p[j-1]][j-1]])
q[i][j]=q[i+p[j-1]][j-1];
}
for(i=1;i<=m;i++)
{
f>>x>>y;
x=ap[x];
y=ap[y];
if(x>y)
swap(x,y);
for(j=0;p[j]<=y-x+1;j++);
j--;
if(j!=0)
{
if(l[q[x][j]]<l[q[y-p[j]+1][j]])
g<<eu[q[x][j]];
else
g<<eu[q[y-p[j]+1][j]];
}
else
{
if(y-x==1)
g<<eu[q[x][1]];
else
g<<eu[q[x][0]];
}
g<<'\n';
}
return 0;
}