Pagini recente » Cod sursa (job #3239966) | Cod sursa (job #302633) | Cod sursa (job #1343334) | Cod sursa (job #703306) | Cod sursa (job #2374366)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
int tat[100001],N,M;
int lg[100001],rmq[30][200001],rmqcop[30][200001];
vector <int> ad[100001],elem,grad;
int poz[100001];
void read()
{fin>>N>>M;
for(int i=2;i<=N;i++)
{fin>>tat[i];
ad[tat[i]].push_back(i);
}
}
void dfs(int nod,int grade)
{elem.push_back(nod);
grad.push_back(grade);
for(int i = 0 ; i < ad[nod].size() ; i++)
{
dfs(ad[nod][i],grade+1);
elem.push_back(nod);
grad.push_back(grade);
}
}
void RMQ()
{ int x,y;
for(int i=0;i<elem.size();i++)
{
rmq[0][i]=grad[i];
rmqcop[0][i]=elem[i];
}
lg[2]=1;
for(int i=3;i<=100001-2;++i)
lg[i]=lg[i/2]+1;
for(int i=1; ( 1 << i) <= elem.size(); ++i)
for(int j=1; j + ( 1 << i ) - 1 <= elem.size(); ++j)
{
rmq[i][j] = min ( rmq[i-1][j] , rmq[i-1][j + ( 1 << (i-1) )]);
if ( rmq[i-1][j] < rmq[i-1][j + ( 1 << (i-1) ) ] )
rmqcop[i][j] = rmqcop[i-1][j];
else
rmqcop[i][j] = rmqcop[i-1][j + ( 1 << (i-1) ) ];
}
for(int i = 1; i <= M; ++i)
{
fin >> x >> y;
if(poz[y]<poz[x])swap(x,y);
int L=(poz[y]-poz[x])+1;
if(rmq[lg[L]][poz[x]] < rmq[lg[L]][poz[y] - ( 1 << lg[L] ) + 1])
fout << rmqcop[lg[L]][poz[x]]<<"\n";
else
fout<<rmqcop [lg[L]][poz[y] - ( 1 << lg[L] ) + 1]<<"\n";
//fout << min(rmq[lg[L]][poz[x]], rmq[lg[L]][poz[y] - ( 1 << lg[L] ) + 1])<<"\n";
}
}
void Do()
{int i;
for(i=0 ; i <= elem.size() ; i++)
if(poz[ elem[i] ] == 0)
{
poz[ elem [i] ] = i;
}
RMQ();
}
int main()
{
read();
dfs(1,1);
Do();
//for(int i=0;i<elem.size();i++)
//cout<<grad[i]<<" ";
return 0;
}