Pagini recente » Cod sursa (job #1593071) | Cod sursa (job #2500440) | Cod sursa (job #172620) | Cod sursa (job #2954845) | Cod sursa (job #2628089)
#include <bits/stdc++.h>
using namespace std;
/***********************************************/
/// input/output
ifstream f("lca.in");
ofstream g("lca.out");
/***********************************************/
///variabile globale
vector<int>v[100001];
int nr , ap[100001], n , m;
pair<int, int>rmq[800001][21];
/***********************************************/
///------------------------------------------------------
inline void readInput()
{
f>>n>>m;
for(int i=2;i<=n;i++)
{
int x;
f>>x;
v[x].push_back(i);
}
}
///------------------------------------------------------
inline void dfs(int nod, int grad)
{
rmq[++nr][0].first= grad;
rmq[nr][0].second = nod;
if(v[nod].size()==0)
{
return;
}
for(int i=0;i< v[nod].size();i++)
{
if(!ap[v[nod][i]])
{
ap[v[nod][i]] =nr+1;
dfs(v[nod][i], grad+1);
rmq[++nr][0].first =grad;
rmq[nr][0].second = nod;
}
}
}
///------------------------------------------------------
inline void calculeazaRMQ()
{
int k=log2(nr);
for(int j = 1; j <= k+1; ++j)
for(int i = 1; i <= nr - (1 << j) + 1; ++i)
{
int x = rmq[i][j - 1].first;
int y = rmq[i][j - 1].second;
int x2 = rmq[i + (1 << (j - 1))][j - 1].first;
int y2 = rmq[i + (1 << (j - 1))][j - 1].second;
if(x<x2)
rmq[i][j] = {x,y};
else rmq[i][j] = {x2,y2};
}
}
///------------------------------------------------------
inline void Solution()
{
ap[1]=1;
dfs(1,0);
calculeazaRMQ();
while(m--)
{
int st , dr;
f>>st>>dr;
st= ap[st];
dr = ap[dr];
if(st>dr) swap(st , dr);
int k = log2(dr-st+1);
int x= rmq[st][k].first;
int y = rmq[st][k].second;
int x2 = rmq[dr- (1<<k) + 1][k].first;
int y2 = rmq[dr - (1<<k) +1 ][k].second;
if(x<x2)
{
g<<y<<"\n";
}
else g<<y2<<"\n";
}
}
///------------------------------------------------------
int main()
{
readInput();
Solution();
return 0;
}