Pagini recente » Cod sursa (job #1692512) | Cod sursa (job #1917415) | Cod sursa (job #1043112) | Cod sursa (job #1520877) | Cod sursa (job #2153815)
#include <iostream>
#include <fstream>
#include <vector>
#define MAX 100001
#define VMAX 1000000000
#define x first
#define y second
using namespace std;
int n,m,p,a,b,sz,i2,szi,sp;
int lv[MAX*2],euler[MAX*2],first[MAX],p2[MAX*2];
pair<int,int> s[MAX*2][18],ans;
vector<int> nd[MAX];
void parcurge(int nod,int niv){
first[nod]=++sz;
euler[sz]=nod;
lv[sz]=niv;
s[sz][0]=make_pair(niv,nod);
for(auto i:nd[nod]){
parcurge(i,niv+1);
euler[++sz]=nod;
lv[sz]=niv;
s[sz][0]=make_pair(niv,nod);
}
}
int rmq(int st,int dr){
if(st>dr)swap(st,dr);
szi=dr-st+1;
ans=min(s[st][p2[szi]],s[dr-(1<<p2[szi])+1][p2[szi]]);
return ans.y;
}
int main()
{
ifstream f ("lca.in");
ofstream g ("lca.out");
f>>n>>m;
for(int i=2;i<=n;i++)f>>i2,nd[i2].push_back(i);
parcurge(1,0);
for(sp=1;sp<=17;sp++) for(int i=1;i<=sz;i++)
s[i][sp]=min(s[i][sp-1],s[min(sz,i+(1<<(sp-1)))][sp-1]);
for(sp=0;sp<=17;sp++) for(int i=(1<<sp);i<=sz&&i<(1<<(sp+1));i++)p2[i]=sp;
for(int i=1;i<=m;i++) f>>a>>b,g<<rmq(first[a],first[b])<<'\n';
f.close();
g.close();
return 0;
}