Pagini recente » Cod sursa (job #523316) | Cod sursa (job #2866555) | Cod sursa (job #1816303) | Cod sursa (job #2490906) | Cod sursa (job #1081817)
#include <fstream>
#include <vector>
using namespace std;
ifstream fi("lca.in");
ofstream fo("lca.out");
int N,M,PE[100001*2],poz[100001],niv[100001],rmq[20][2*100001],log[2*100001];
vector<int>G[100001];
void euler(int vf,int k) {
PE[++PE[0]]=vf;
niv[vf]=k;
vector<int>::iterator it;
for (it=G[vf].begin();it!=G[vf].end();++it) {
euler(*it,k+1);
PE[++PE[0]]=vf;}
}
int main() {
int i,j,k,sol;
fi>>N>>M;
for (i=2;i<=N;++i) {
fi>>k;
G[k].push_back(i);}
euler(1,0);
for (i=1;i<=PE[0];++i) poz[PE[i]]=i;
for (i=1;i<=PE[0];++i) rmq[0][i]=PE[i];
for (i=1;(1<<i)<=PE[0];++i)
for (j=1;j+(1<<i)-1<=PE[0];++j)
rmq[i][j]= niv[rmq[i-1][j]] < niv[rmq[i-1][j+(1<<(i-1))]] ? rmq[i-1][j] : rmq[i-1][j+(1<<(i-1))];
log[1]=0;
for (i=2;i<=PE[0];++i) log[i]=log[i/2]+1;
while (M--) {
fi>>i>>j;
i=poz[i];
j=poz[j];
if (i>j) swap(i,j);
k=log[j-i+1];
sol= niv[rmq[k][i]] < niv[rmq[k][j-(1<<k)+1]] ? rmq[k][i] : rmq[k][j-(1<<k)+1];
fo<<sol<<'\n';}
return 0;
}