Pagini recente » Cod sursa (job #1023010) | Cod sursa (job #2673866) | Cod sursa (job #2965513) | Cod sursa (job #261659) | Cod sursa (job #786038)
Cod sursa(job #786038)
#include <fstream>
#include <vector>
#include <math.h>
#define MAXN 100005
using namespace std;
ifstream f("lca.in");
ofstream g("lca.out");
int n,m,s,x,y,aux,tata[MAXN],fa[MAXN],mn[500000][20],cnt,lg;
vector<int> G[MAXN],dfv;
void dfs(int p);
int MIN(int a,int b);
int main()
{
int i,j;
f>>n>>m;
for(i=2;i<=n;i++){
f>>tata[i];
G[tata[i]].push_back(i);}
dfs(1);
s=dfv.size();
for(i=0;i<s;i++)
mn[i][0]=dfv[i];
for(i=2;i<=s;i<<=1){
cnt++;
for(j=0;j+i<=s;j++)
mn[j][cnt]=MIN(mn[j][cnt-1],mn[j+i/2][cnt-1]);}
for(i=1;i<=m;i++){
f>>x>>y;
x=fa[x];
y=fa[y];
if(x>y){
aux=x;
x=y;
y=aux;}
lg=(int)(log2(((double)(y-x+1))));
g<<MIN(mn[x][lg],mn[y-(1<<lg)+1][lg])<<'\n';}
f.close();
g.close();
return 0;
}
void dfs(int p){
int i;
fa[p]=dfv.size();
dfv.push_back(p);
for(i=0;i<G[p].size();i++){
dfs(G[p][i]);
dfv.push_back(p);}}
int MIN(int a,int b){
return a<b?a:b;}