Pagini recente » Rating dragomir ioana roxana (bingbang) | Rating Noemi Noemi (noemirk) | Cod sursa (job #569672)
Cod sursa(job #569672)
#include <fstream>
#include <cstdio>
#include <vector>
#include <iostream>
using namespace std;
const int NMAX=100001,DMAX=2*NMAX,LOG=18;
ifstream fin("lca.in");
FILE *fout=fopen("lca.out","w");
vector< vector<int> > t(NMAX);
vector< vector<int> > sMin(LOG,vector<int>(DMAX));
vector< pair<int,int> > euler(DMAX);
vector<int> p(NMAX);
int N,Q,cEuler;
void citire(),rezolvare();
int main()
{
citire();
rezolvare();
return 0;
}
void dfs(int tata,int adancime=0)
{
pair<int,int> aux=pair<int,int>(tata,adancime);
euler[++cEuler]=aux;
p[tata]=cEuler;
for(vector<int>::iterator i=t[tata].begin();i!=t[tata].end();i++)
{
dfs(*i,adancime+1);
euler[++cEuler]=aux;
}
}
inline int minim(int a,int b)
{
if(euler[a].second>euler[b].second)
return b;
return a;
}
void rezolvare()
{
dfs(1);
for(int i=1;i<=cEuler;i++)
sMin[0][i]=i;
for(int j=1;(1<<j)<=cEuler;j++)
for(int i=1;i+(1<<j)<=cEuler;i++)
sMin[j][i]=minim(sMin[j-1][i],sMin[j-1][i+(1<<(j-1))]);
while(Q--)
{
int a,b,k;
fin>>a>>b;
a=p[a],b=p[b];
if(a>b)swap(a,b);
for(k=17;0==((1<<k)&(b-a+1));--k);
fprintf(fout,"%d\n",euler[minim(sMin[k][a],sMin[k][b-(1<<k)+1])].first);
}
fin.close();
fclose(fout);
}
void citire()
{
fin>>N>>Q;
for(int i=2;i<=N;i++)
{
int tata;
fin>>tata;
t[tata].push_back(i);
}
}