Pagini recente » Cod sursa (job #3310099) | Cod sursa (job #3354097) | Cod sursa (job #3348815) | Cod sursa (job #3310085) | Cod sursa (job #3349693)
#include<iostream>
#include<fstream>
#include<vector>
#include<algorithm>
using namespace std;
ifstream in("lca.in");
ofstream out("lca.out");
struct node{
int depth,ind;
node(){
depth=0;
ind=0;
}
node(int d,int i){
depth=d;
ind=i;
}
bool operator<(const node& other)
const {
return depth<other.depth;
}
void operator=(const node& other)
{
depth=other.depth;
ind=other.ind;
}
};
const int NMAX=200007,LOGMAX=20;
int n,m,nod;
int dad[NMAX];
vector<int> sons[NMAX];
vector<node> euler;
node rmq[NMAX][LOGMAX];//rmq[i][j]=min pe i,i+1,...,i+2^j-1
int deep[NMAX];
int poz[NMAX];
int logn;
void dfs(int nod)
{
node nodat(deep[nod],nod);
poz[nod]=euler.size()+1;
euler.push_back(nodat);
for(auto w:sons[nod])
{
deep[w]=deep[nod]+1;
dfs(w);
euler.push_back(nodat);
}
}
int get_exp(int nr)
{
int pt=1;
for(int i=0;i<=LOGMAX+1;i++)
{
if(pt>nr)
{
return i-1;
}
pt=pt<<1;
}
return 0;
}
int main()
{
in>>n>>m;
logn=get_exp(2*n);
for(int i=2;i<=n;i++)
{
in>>dad[i];
sons[dad[i]].push_back(i);
}
deep[1]=0;
dfs(1);
int it=1;
for(auto w:euler)
{
rmq[it][0]=w;
it++;
}
for(int j=1;j<logn;j++)
{
for(int i=1;i<=it-(1<<j);i++)
{
rmq[i][j]=min(rmq[i][j-1],rmq[i+(1<<(j-1))][j-1]);
}
}
int a,b;
for(int i=1;i<=m;i++)
{
in>>a>>b;
int rig=max(poz[a],poz[b]);
int lef=min(poz[a],poz[b]);
int put=get_exp(rig-lef+1);
node aux=min(rmq[lef][put],rmq[rig-(1<<put)+1][put]);
out<<aux.ind<<"\n";
}
}