Pagini recente » Cod sursa (job #322667) | Cod sursa (job #2668820) | Cod sursa (job #1182880) | Borderou de evaluare (job #798045) | Cod sursa (job #969392)
Cod sursa(job #969392)
#include <iostream>
#include <fstream>
#include <cmath>
#include <vector>
#include <bitset>
#include <queue>
#include <deque>
#include <list>
#include <set>
#include <ctime>
#include <string>
#include <cstring>
#include <iomanip>
#include <algorithm>
using namespace std;
ifstream ff("lca.in");
ofstream gg("lca.out");
#define max 100001
vector<int> vv[max];
int n, m, cc[2*max], nv[2*max], pp[max], rr[2*max][18], k;
bool ww[max];
void dfs(int a,int j){
int l=vv[a].size(), b;
ww[a]=1;
cc[++k]=a;
nv[k]=j;
for(int i=0;i<l;i++){
b=vv[a][i];
if(!ww[b])dfs(b,j+1);
cc[++k]=a;
nv[k]=j;
}
}
void rmq(){
for(int i=1;i<=k;i++) rr[i][0]=i;
for(int j=1;(1<<j)<=k;j++)
for(int i=1;i+(1<<j)-1<=k;i++)
if(nv[rr[i][j-1]]<nv[rr[i+(1<<(j-1))][j-1]])
rr[i][j]=rr[i][j-1]; else
rr[i][j]=rr[i+(1<<(j-1))][j-1];
}
int main(){
int a, b, c;
ff >> n >> m;
for(int i=2;i<=n;i++){
ff >> a;
vv[a].push_back(i);
}
dfs(1,0);
for(int i=1;i<=k;i++)
if(!pp[cc[i]])pp[cc[i]]=i;
rmq();
for(int i=1;i<=m;i++){
ff >> a >> b;
a=pp[a]; b=pp[b]; if(a>b)swap(a,b);
c=log(b-a+1)/log(2);
if(nv[rr[a][c]]<nv[rr[b-(1<<c)+1][c]])gg << cc[rr[a][c]] << "\n"; else
gg << cc[rr[b-(1<<c)+1][c]] << "\n";
}
}