Pagini recente » Cod sursa (job #2427693) | Cod sursa (job #2710451) | Cod sursa (job #308662) | Cod sursa (job #1276360) | Cod sursa (job #3306439)
#include <fstream>
#include <vector>
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
const int NMAX = 1e5 + 5;
vector<int> adj[NMAX];
vector<int>first(NMAX);
vector<pair<int,int>>euler;
vector<int>lg(2*NMAX);
pair<int,int> rmq[2*NMAX][20];
void dfs(int nod,int parinte,int nivel)
{
first[nod]=euler.size();
euler.push_back({nivel,nod});
for(int i:adj[nod])
{
if(parinte!=i)
{
dfs(i,nod,nivel+1);
euler.push_back({nivel,nod});
}
}
}
void build_rmq()
{
int nrmq=euler.size();
lg[1]=0;
for(int i=2;i<=euler.size();i++)lg[i]=lg[i/2]+1;
for(int i=0;i<euler.size();i++)rmq[i][0]=euler[i];
for(int j=1;(1<<j)<=nrmq;j++)
{
for(int i=0;i+(1<<j)<=nrmq;i++)
{
rmq[i][j]=min(rmq[i][j-1],rmq[i+(1<<(j-1))][j-1]);
}
}
}
int query(int x,int y)
{
x=first[x];
y=first[y];
if(x>y)swap(x,y);
int len=y-x+1;
int p=lg[len];
return min(rmq[x][p],rmq[y-(1<<p)+1][p]).second;
}
int main()
{
int n, m;
fin >> n >> m;
for (int i = 2; i <= n; i++)
{
int x;
fin >> x;
adj[x].push_back(i);
adj[i].push_back(x);
}
dfs(1, 0,0);
build_rmq();
while(m--)
{
int st,dr;
fin>>st>>dr;
fout<<query(st,dr)<<'\n';
}
}