Pagini recente » Cod sursa (job #1738869) | Cod sursa (job #1420638) | Cod sursa (job #582712) | Cod sursa (job #1052719) | Cod sursa (job #3149781)
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
const int Nmax=200005;
int depth[Nmax];
int poz[Nmax];
int rmq[Nmax][20];
vector<int> v[Nmax];
vector<int> e,l;
int log(int x)
{
int pow=1,nr=0;
while(x>=pow)
{
pow=pow*2;
nr++;
}
return (nr-1);
}
int rminq(int i,int j)
{
if(i>j)
{
int aux=j;
j=i;
i=aux;
}
int x=log(j-i+1);
int fhalf=l[rmq[i][x]],shalf=l[rmq[j-(1<<x)+1][x]];
if(fhalf<=shalf) return rmq[i][x];
else return rmq[j-(1<<x)][x];
}
void euler(int i)
{
e.push_back(i);
poz[i]=e.size();
for(int j=0; j<v[i].size(); j++)
{
euler(v[i][j]);
e.push_back(i);
}
return;
}
int main()
{
int n,m,x;
fin>>n>>m;
for(int i=1; i<n; i++)
{
fin>>x;
v[x].push_back(i+1);
depth[i+1]=depth[x]+1;
}
euler(1);
l.push_back(0);
for(int i=0; i<e.size(); i++)
{
l.push_back(depth[e[i]]);
}
for(int i=1; i<=e.size(); i++)
{
rmq[i][0]=i;
}
for(int p=1; p<=log(e.size()); p++)
{
for(int i=1; i<=e.size(); i++)
{
int fhalf=l[rmq[i][p-1]],shalf=l[rmq[i+(1<<(p-1))][p-1]];
if(fhalf<=shalf) rmq[i][p]=rmq[i][p-1];
else rmq[i][p]=rmq[i+(1<<(p-1))][p-1];
}
}
int y;
for(int i=1;i<=m;i++)
{
fin>>x>>y;
/// cout<<rminq(poz[x],poz[y])<<' '<<poz[x]<<' '<<poz[y]<<'\n';
int lca=e[rminq(poz[x],poz[y])-1];
fout<<lca<<'\n';
}
return 0;
}