Pagini recente » Borderou de evaluare (job #178821) | Cod sursa (job #327111) | Borderou de evaluare (job #2972336) | Borderou de evaluare (job #3312616) | Cod sursa (job #3339955)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
struct types{
int val;int nod;
};
int n,m;
vector<vector<int>> v;
vector<int> first;
vector<int> euler;
vector<int> depths;
vector<bool> checked;
void ini(int nod,int depth){
checked[nod] = 1;
euler.push_back(nod);
depths.push_back(depth);
first[nod] = euler.size()-1;
for(int i=0;i<v[nod].size();i++){
int newnod = v[nod][i];
if(checked[newnod] == 0){
ini(newnod,depth + 1);
euler.push_back(nod);
depths.push_back(depth);
}
}
}
int main()
{
fin>>n>>m;
v.resize(n+1);
checked.resize(n+1,0);
first.resize(n+1);
for(int i=2;i<=n;i++){
int p;
fin>>p;
v[i].push_back(p);
v[p].push_back(i);
}
ini(1,0);
vector<int> log(euler.size()+2);
log[1] = 0;
for(int i=2;i<=euler.size();i++)
log[i] = log[i/2] + 1;
vector<vector<types>> rmq(euler.size()+1,vector<types>(log[euler.size()]+1));
for(int i=0;i<euler.size();i++){
rmq[i][0].val = depths[i];
rmq[i][0].nod = euler[i];
}
for(int j = 1;j<log[euler.size()];j++){
for(int i=0;i+(1<<j)-1 < euler.size();i++){
int power = 1<<(j-1);
if(rmq[i][j-1].val < rmq[i+power][j-1].val)
rmq[i][j] = rmq[i][j-1];
else
rmq[i][j] = rmq[i+power][j-1];
//fout<<"de la "<<i<<" la "<<i+(1<<j)-1<<" cu depth "<<rmq[i][j].val<<" nodul "<<rmq[i][j].nod<<"\n";
}
}
for(int i=1;i<=m;i++){
int x,y;
fin>>x>>y;
int l = first[x];
int r = first[y];
int maxlog = log[r-l+1];
if(rmq[l][maxlog].val < rmq[r-(1<<maxlog)+1][maxlog].val)
fout<<rmq[l][maxlog].nod<<"\n";
else
fout<<rmq[r-(1<<maxlog)+1][maxlog].nod<<"\n";
}
}