Pagini recente » Cod sursa (job #752667) | Cod sursa (job #2255645) | Cod sursa (job #2709117) | Cod sursa (job #750455) | Cod sursa (job #1638386)
#include<fstream>
#include<vector>
using namespace std;
vector<int> L[100005];
bool u[100005];
int n, m, nx, x[19][200005], xx, y[200005], first[200005], p, a, b, fiu, i, j;
void euler(int nod)
{
x[0][++nx]=nod;
if(first[nod]==0)
first[nod]=nx;
for(int i=0; i<L[nod].size(); i++)
{
int fiu=L[nod][i];
if(u[fiu]==0)
{
u[fiu]=1;
euler(fiu);
x[0][++nx]=nod;
}
}
}
ifstream in("lca.in");
ofstream out("lca.out");
int main()
{
in>>n>>m;
for(i=2; i<=n; i++)
{
in>>xx;
L[xx].push_back(i);
}
u[1]=1;
euler(1);
for(i=2; i<=nx; i++)
y[i]=1+y[i/2];
for(i=1; (1<<i)<=nx; i++)
{
for(j=1; j<=nx; j++)
{
x[i][j]=min(x[i-1][j], x[i-1][j+(1<<(i-1))]);
}
}
for(;m--;)
{
in>>a>>b;
a=first[a];
b=first[b];
if(a>b)
swap(a, b);
p=y[b-a+1];
out<<min(x[p][a], x[p][b-(1<<p)+1])<<"\n";
}
return 0;
}