Pagini recente » Cod sursa (job #1289277) | Cod sursa (job #1825296) | Cod sursa (job #1003768) | Cod sursa (job #1048019) | Cod sursa (job #2495126)
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
ifstream f ("lca.in");
ofstream g ("lca.out");
int n,m;
int t;
int euler[100005];
int niv[100005];
int poz[100005], log[100005], rmq[21][100005];
vector<int> muchii[100005];
int siz=0;
void oilar(int nod, int lvl)
{
siz++;
niv[siz]=lvl;
euler[siz]=nod;
poz[nod]=siz;
for(int i=0;i<muchii[nod].size();i++)
{
oilar(muchii[nod].at(i), lvl+1);
siz++;
niv[siz]=lvl;
euler[siz]=nod;
}
}
int main()
{
f>>n>>m;
for(int i=2;i<=n;++i)
{
f>>t;
muchii[t].push_back(i);
}
oilar(1,1);
for(int i=2; i<=siz; i*=2) log[i]++;
for(int i=1; i<=siz; i++) log[i]+=log[i-1];
for(int i=1;i<=siz;i++)
{
// f>>vek[i];
rmq[0][i]=niv[i];
}
for(int h=1;(1<<h)<=siz;++h)
{
for(int i=1;i<=siz-(1<<h)+1;++i)
{
rmq[h][i]=min(rmq[h-1][i],rmq[h-1][i+(1<<(h-1))]);
}
}
for(int i=1;i<=m;++i)
{
int x,y;
f>>x>>y;
x=poz[x];
y=poz[y];
if(x>y)
swap(x,y);
int h=log[y-x+1];
if(niv[rmq[h][x]]<niv[rmq[h][y-(1<<h)+1]])
g<<euler[rmq[h][x]]<<"\n";
else g<<euler[rmq[h][y-(1<<h)+1]]<<"\n";
}
return 0;
}