Pagini recente » Cod sursa (job #1173080) | Cod sursa (job #2707837) | Cod sursa (job #2283541) | Cod sursa (job #252770) | Cod sursa (job #1638391)
#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];
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);
}
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;
}