Pagini recente » Cod sursa (job #296363) | Cod sursa (job #425197) | Cod sursa (job #1010311) | Cod sursa (job #250339) | Cod sursa (job #2566199)
#include <fstream>
#include <vector>
#define N 100002
#include <iostream>
using namespace std;
ifstream f("lca.in");
ofstream g("lca.out");
vector <int> graph[N];
int euler[3*N],niv[N],first[N],arb[1<<18],nr,x,poz,a,b,sol;
bool viz[N];
void solve(int st, int dr, int nod)
{
if(a<=st && dr<=b)
{
if(niv[sol]>niv[arb[nod]])
sol=arb[nod];
}
else
{
int mij=(st+dr)/2;
if(a<=mij) solve(st,mij,2*nod);
if(mij<b) solve(mij+1,dr,2*nod+1);
}
}
void update(int st, int dr, int nod)
{
if(st==dr)
arb[nod]=x;
else
{
int mij=(st+dr)/2;
if(poz<=mij) update(st,mij,2*nod);
else update(mij+1,dr,2*nod+1);
int fs=arb[2*nod],fd=arb[2*nod+1];
if(niv[fs]>niv[fd])
arb[nod]=fd;
else
arb[nod]=fs;
}
}
void eul(int nod)
{
viz[nod]=1;
euler[++nr]=nod;
first[nod]=nr;
for(int i=0;i<graph[nod].size();++i)
{
int vee=graph[nod][i];
if(!viz[vee])
{
niv[vee]=niv[nod]+1;
eul(vee);
euler[++nr]=nod;
}
}
}
int main()
{
int n,m;
f>>n>>m;
for(int i=1;i<n;++i)
{
f>>x;
graph[x].push_back(i+1);
}
eul(1);
for(int i=1;i<=nr;++i)
{
poz=i;
x=euler[i];
update(1,nr,1);
}
niv[0]=2000000000;
while(m--)
{
f>>a>>b;
a=first[a];
b=first[b];
if(a>b) swap(a,b);
sol=0;
solve(1,nr,1);
g<<sol<<'\n';
}
f.close();
g.close();
return 0;
}