Pagini recente » Cod sursa (job #2186327) | Cod sursa (job #1845412) | Cod sursa (job #2911924) | Cod sursa (job #2894121) | Cod sursa (job #2568685)
#include <fstream>
#include <vector>
#define N 100002
#include <fstream>
using namespace std;
ifstream f("lca.in");
ofstream g("lca.out");
vector <int> graph[N];
int rmq[20][3*N],log[3*N],nr;
int niv[N],first[N];
bool viz[N];
void eul(int nod)
{
rmq[0][++nr]=nod;
first[nod]=nr;
viz[nod]=1;
for(int i=0;i<graph[nod].size();++i)
{
int vee=graph[nod][i];
if(!viz[vee])
{
niv[vee]=niv[nod]+1;
eul(vee);
rmq[0][++nr]=nod;
}
}
}
int main()
{
int n,m,x;
f>>n>>m;
for(int i=1;i<n;++i)
{
f>>x;
graph[x].push_back(i+1);
}
eul(1);
log[0]=-1;
for(int i=1;i<=nr;++i) log[i]=1+log[i/2];
int p=1;
for(int i=1;i<=log[nr];++i)
{
for(int j=1;j+p<=nr;++j)
{
int n1=rmq[i-1][j],n2=rmq[i-1][j+p];
if(niv[n1]>niv[n2]) rmq[i][j]=n2;
else rmq[i][j]=n1;
}
p*=2;
}
int a,b,dif,lin,sol;
while(m--)
{
f>>a>>b;
a=first[a];
b=first[b];
if(a>b) swap(a,b);
dif=b-a+1;
lin=log[dif];
p=(1<<lin);
int n1=rmq[lin][a],n2=rmq[lin][b-p+1];
if(niv[n1]>niv[n2]) sol=n2;
else sol=n1;
g<<sol<<'\n';
}
f.close();
g.close();
return 0;
}