Pagini recente » Cod sursa (job #1267779) | Cod sursa (job #317573) | Cod sursa (job #255347) | Cod sursa (job #3284124) | Cod sursa (job #3002628)
#include <bits/stdc++.h>
#define N 100007
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
int n,q;
vector<int> a[N];
vector<int> v(N);
vector<int> ordine(2*N-1,-1); int poz;
vector<int> aparitie_fin(N,0);
vector<int> adancime(2*N,0);
void Tur(int x,int tata,int depth)
{
ordine[++poz]=x;
adancime[poz]= depth;
aparitie_fin[x] = poz;
for( auto y:a[x] )
if(y!=tata)
{
Tur(y,x,depth+1);
ordine[++poz]=x;
adancime[poz]= depth;
aparitie_fin[x] = poz;
}
}
int RMQ[20][2*N-1];
vector<int>putere(2*N-1,0);
void Gen_RMQ()
{
for(int i=2;i<=2*n-1;i++)
putere[i]=putere[i/2]+1;
for(int i=1;i<=2*n-1;i++)
RMQ[0][i]=i;
for(int k=1;k<=putere[2*n-1];k++)
for(int i=1;i<=2*n -(1<<k) ;i++)
{
int dist= (1<<(k-1));
RMQ[k][i]=RMQ[k-1][i];
if( adancime[ RMQ[k-1][i+dist] ] < adancime[ RMQ[k][i] ] )
RMQ[k][i]=RMQ[k-1][i+dist];
}
// for(int i=1;i<=2*n-1;i++)
// cout << RMQ[1][i] << " ";
}
int Rezolvare(int x,int y)
{
int st=min( aparitie_fin[x],aparitie_fin[y] );
int dr=max( aparitie_fin[x],aparitie_fin[y] );
int dist=dr-st+1;
int p=putere[dist];
dist= (1<<p);
if( adancime[ RMQ[p][st] ]<adancime[ RMQ[p][dr-dist+1] ] )
{
return ordine[ RMQ[p][st] ] ;
}
else
return ordine[ RMQ[p][dr-dist+1] ] ;
// cout << "DA";
}
int main()
{
fin >> n >> q ;
for(int i=2;i<=n;i++)
{
int x,y;
fin >> x ;
a[x].push_back(i);
a[i].push_back(x);
}
Tur(1,0,0);
Gen_RMQ();
int ans=-INT_MAX;
pair<int,int> r;
for(int i=1;i<=q;i++)
{
int x,y;
fin >> x >> y;
int l=Rezolvare(x,y);
fout << l << "\n";
}
fin.close();
fout.close();
return 0;
}