Pagini recente » Cod sursa (job #169728) | Istoria paginii utilizator/eduardpetre | Cod sursa (job #2885303) | Cod sursa (job #955745) | Cod sursa (job #2447557)
#include <fstream>
#include <vector>
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
vector<int> a[100003];
int n, m;
int rmq[210000][20], log[210000];
vector<int> e, l, p;
void dfs(int x=1, int y=0, int lv=1)
{
e.push_back(x);
l.push_back(lv);
for(int i=0;i<a[x].size();++i)
dfs(a[x][i], x, lv+1);
e.push_back(y);
l.push_back(lv-1);
}
int main()
{
fin>>n>>m;
for(int i=1;i<n;++i)
{
int x;
fin>>x;
a[x].push_back(i+1);
}
dfs();
e.pop_back();
int L=e.size();
for(int i=0;i<=n+3;++i) p.push_back(0);
for(int i=0;i<L;++i)
if(p[e[i]]==0) p[e[i]]=i;
for(int i=2;i<=L;++i) log[i]=log[i/2]+1;
for(int i=0;i<L;++i)
{
rmq[i][0]=i;
}
for(int j=1;j<=log[L];++j)
for(int i=0;i+(1<<j)-1<L;++i)
{
if(l[rmq[i][j-1]]<l[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, u, v, k;
fin>>u>>v;
x=p[u];
y=p[v];
if(x>y) swap(x, y);
k=log[y-x+1];
if(l[rmq[x][k]]<l[rmq[y-(1<<k)+1][k]]) fout<<e[rmq[x][k]]<<"\n";
else fout<<e[rmq[y-(1<<k)+1][k]]<<"\n";
}
return 0;
}