Pagini recente » Cod sursa (job #73632) | Cod sursa (job #2857751) | Cod sursa (job #3333161) | Monitorul de evaluare | Cod sursa (job #3348979)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
int n,q;
vector<int> first;
vector<int> last;
vector<pair<int,int>> euler;
vector<vector<int>> v;
void dfs(int nod,int p,int depth){
euler.push_back({depth,nod});
first[nod] = min(first[nod],(int)euler.size()-1);
for(int i=0;i<v[nod].size();i++){
int newnod = v[nod][i];
if(newnod == p)
continue;
dfs(newnod,nod,depth+1);
euler.push_back({depth,nod});
last[nod] = euler.size() - 1;
}
}
int main(){
fin>>n>>q;
v.resize(n+1);
first.resize(n+1,1e9);
last.resize(n+1);
for(int i=2;i<=n;i++){
int pi;
fin>>pi;
v[i].push_back(pi);
v[pi].push_back(i);
}
dfs(1,0,0);
int E = euler.size()-1;
vector<int> lg(E+1);
lg[1] = 0;
for(int i=2;i<=E;i++)
lg[i] = lg[i/2] + 1;
vector<vector<pair<int,int>>> rmq(E+1,vector<pair<int,int>>(lg[E]+1));
for(int i=0;i<=E;i++)
rmq[i][0] = euler[i];
for(int i=1;i<=lg[E];i++){
int p2 = 1<<i;
for(int j = 0;j + p2 <= E ;j++){
pair<int,int> frmq = rmq[j][i-1];
pair<int,int> srmq = rmq[j+(1<<(i-1))][i-1];
if(frmq.first < srmq.first)
rmq[j][i] = frmq;
else
rmq[j][i] = srmq;
}
}
for(int i=1;i<=q;i++){
int x,y;
fin>>x>>y;
if(first[x] > first[y])
swap(x,y);
int l = first[x];
int r = first[y];
int d = r - l + 1;
pair<int,int> frmq = rmq[l][lg[d]];
pair<int,int> srmq = rmq[r - (1<<lg[d]) + 1][lg[d]];
if(frmq.first < srmq.first)
fout<<frmq.second<<"\n";
else
fout<<srmq.second<<"\n";
}
}