Pagini recente » Cod sursa (job #318848) | Cod sursa (job #671123) | Cod sursa (job #2608485) | Cod sursa (job #2258791) | Cod sursa (job #2153631)
#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;
int lv[MAX*2],euler[MAX*2],first[MAX];
pair<int,int> s[MAX*2][18];
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);
int szi=dr-st+1;
pair<int,int> ans=make_pair(VMAX,0);
for(int sp=0;szi;sp++,szi/=2)
if(szi%2){
ans=min(ans,s[st][sp]),st+=(1<<sp);
}
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(int 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(int i=1;i<=m;i++){
f>>a>>b;
g<<rmq(first[a],first[b])<<'\n';
}
f.close();
g.close();
return 0;
}