Pagini recente » Cod sursa (job #1553263) | Cod sursa (job #620696) | Cod sursa (job #1260531) | Cod sursa (job #370842) | Cod sursa (job #1075253)
#include <iostream>
#include <fstream>
#include <algorithm>
#include <vector>
using namespace std;
ifstream f("lca.in");
ofstream g("lca.out");
int n, m, lvl[100005], a[20][10000000], lca[100005], x, y, p, sz;
vector<int> lv[100005];
vector<int> v, rmq;
void df(int x)
{
a[0][++sz]=x;
vector<int>::iterator it;
for(it=lv[x].begin(); it!=lv[x].end(); ++it)
df(*it), v.push_back(x), a[0][++sz]=x;
}
void RMQ(){
for(int i=sz; i>0; --i)
for(int k=1; (1<<k)<=sz; ++k)
if(lvl[a[k-1][i]]<lvl[a[k-1][i+(1<<(k-1))]])
a[k][i]=a[k-1][i];
else
a[k][i]=a[k-1][i+(1<<(k-1))];
}
int main()
{
f>>n>>m;
lvl[1]=0;
for(int i=2; i<=n; ++i)
f>>x, lvl[i]=lvl[x]+1, lv[x].push_back(i);
df(1);
RMQ();
for(int i=1; i<=sz; ++i)
if(!lca[a[0][i]]) lca[a[0][i]]=i;
while(m--){
f>>x>>y;
x=lca[x];
y=lca[y];
if(y<x) swap(x,y);
p=(int)log2(y-x+1);
if(lvl[a[p][x]]<lvl[a[p][y-(1<<p)+1]])
g<<a[p][x]<<'\n';
else
g<<a[p][y-(1<<p)+1]<<'\n';
}
return 0;
}