Pagini recente » Cod sursa (job #887468) | Cod sursa (job #910850) | Cod sursa (job #2847328) | Cod sursa (job #708728) | Cod sursa (job #3341532)
#include <iostream>
#include <fstream>
#include <vector>
#include <bitset>
#define NMax 100005
#define LMax 18
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
vector<int> vecini[NMax];
bitset <NMax> v;
int n,m,e[NMax*2],rmq[2*NMax][LMax+1],first[NMax],lg[NMax*2],level[NMax*2],cnt;
void dfs(int start, int &cnt,int l)
{
e[++cnt]=start;
level[cnt]=l;
if(v[start]==0)
{
v[start]=1;
first[start]=cnt;
}
for(auto node:vecini[start])
{
dfs(node,cnt,l+1);
e[++cnt]=start;
level[cnt]=l;
}
}
int main()
{
fin>>n>>m;
lg[1]=0;
for(int i=2;i<=2*n;i++)
lg[i]=lg[i/2]+1;
for(int i=2;i<=n;i++)
{
int x;
fin>>x;
vecini[x].push_back(i);
}
cnt=0;
dfs(1,cnt,0);
for(int i=1;i<=2*n-1;i++)
rmq[i][0]=i;
for(int j=1;1<<j<=2*n-1;j++)
{
for(int i=1;i+(1<<j)-1<=2*n-1;i++)
{
if(level[rmq[i][j-1]]<=level[rmq[i+(1<<(j-1))][j-1]])
rmq[i][j]=rmq[i][j-1];
else
rmq[i][j]=rmq[i+(1<<(j-1))][j-1];
}
}
for(int i=1;i<=m;i++)
{
int x,y;
fin>>x>>y;
x=first[x];
y=first[y];
if(x>y)
swap(x,y);
int len=y-x+1;
int ind;
if(level[rmq[x][lg[len]]]<=level[rmq[y-(1<<lg[len])+1][lg[len]]])
ind=rmq[x][lg[len]];
else
ind=rmq[y-(1<<lg[len])+1][lg[len]];
fout<<e[ind]<<"\n";
}
}