Pagini recente » Cod sursa (job #3354050) | Cod sursa (job #3324326) | Cod sursa (job #3324324) | Borderou de evaluare (job #3332531) | Cod sursa (job #3354765)
#include<bits/stdc++.h>
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
vector<int> euler;
vector<int> first;
vector<int> depth;
vector<int> LOG;
vector<vector<int>> v;
vector<vector<pair<int,int>>> rmq;
void dfs(int nod,int p){
first[nod] = euler.size();
euler.push_back(nod);
for(int i = 0 ; i < v[nod].size();i++){
int newnod = v[nod][i];
if(p != newnod){
depth[newnod] = depth[nod] + 1;
dfs(newnod,nod);
euler.push_back(nod);
}
}
}
int main()
{
int n,q;
fin>>n>>q;
v.resize(n+1);
depth.resize(n+1);
first.resize(n+1);
depth[1] = depth[0] = 0;
for(int i=2;i<=n;i++){
int x;
fin>>x;
v[i].push_back(x);
v[x].push_back(i);
}
dfs(1,0);
int N = euler.size()-1;
LOG.resize(N+1);
LOG[1] = 0;
for(int i = 2 ; i <= N;i++)
LOG[i] = LOG[i/2]+1;
rmq.resize(N+1,vector<pair<int,int>>(LOG[N]+1));
for(int i = 0;i<=N;i++)
rmq[i][0] = {euler[i],depth[euler[i]]};
for(int j = 1;j<=LOG[N];j++){
for(int i = 0;i+(1<<j)-1<=N;i++){
if(rmq[i][j-1].second < rmq[i+(1<<(j-1))][j-1].second)
rmq[i][j] = rmq[i][j-1];
else
rmq[i][j] = rmq[i+(1<<(j-1))][j-1];
}
}
for(int i = 1;i<=q;i++){
int a,b;
fin>>a>>b;
if(first[a] > first[b])
swap(a,b);
int posa = first[a];
int posb = first[b];
int bestlog = LOG[posb-posa+1];
pair<int,int> fir = rmq[posa][bestlog];
pair<int,int> sec = rmq[posb-(1<<bestlog)+1][bestlog];
if(fir.second < sec.second)
fout<<fir.first<<"\n";
else
fout<<sec.first<<"\n";
}
}