Pagini recente » Cod sursa (job #2451919) | Cod sursa (job #1631102) | Cod sursa (job #1054455) | Cod sursa (job #2533861) | Cod sursa (job #2496636)
#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];
int rmp[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+1; i*=2) log[i]++;
for(int i=1; i<=siz+1; i++) log[i]+=log[i-1];
for(int i=1;i<=siz+1;i++)
{
rmq[0][i]=i;
}
for(int h=1;(1<<h)<=siz;++h)
{
for(int i=1;i<=siz-(1<<h)+1;++i)
{
if(niv[rmq[h-1][i]]>niv[rmq[h-1][i+(1<<(h-1))]])
rmq[h][i]=rmq[h-1][i+(1<<(h-1))];
else rmq[h][i]=rmq[h-1][i];
}
}
for(int i=1;i<=m;++i)
{
int x,y;
f>>x>>y;
x=poz[x];
y=poz[y];
// cout<<x<<" "<<y<<"\n";
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][y-(1<<h)+1]]<<"\n";
else g<<euler[rmq[h][x]]<<"\n";
}
return 0;
}