Pagini recente » Cod sursa (job #1890574) | Cod sursa (job #1334787) | Cod sursa (job #2688607) | Cod sursa (job #1022169) | Cod sursa (job #2503815)
#include <fstream>
#include <vector>
using namespace std;
ifstream cin("lca.in");
ofstream cout("lca.out");
int rng[200005], n, tata[100005], e[200005], first[100005], l[200005], rmqq[20][200005], log2[200005], cnt=2;
vector<int> v[100005];
bool fol[100005];
void dfs(int nod){
if (v[nod].size()>0)
{for(int i=0;i<v[nod].size();i++)
{
if (fol[v[nod][i]]==0)
{
fol[v[nod][i]]=1;
l[v[nod][i]]=l[nod]+1;
}
e[cnt]=v[nod][i];
cnt++;
dfs(v[nod][i]);
}
e[cnt]=tata[nod];
cnt++;
}
else
{e[cnt]=tata[nod];
cnt++;}
}
int main()
{
int m, a, i, j, s, p, q, k, rez, t;
cin >> n >> m;
for (i=1; i<=n; i++)
rng[i]=999999999;
for (i=2; i<=n; i++){
cin >> a;
tata[i]=a;
v[a].push_back(i);
}
e[1]=1;
dfs(1);
fol[1]=1;
log2[1]=0;
for (i=2; i<=cnt; i++)
log2[i]=log2[i>>1]+1;
for (i=1; i<=cnt-1; i++)
{
if (fol[e[i]]==1)
{
fol[e[i]]=0;
first[e[i]]=i;
}
rng[i]=l[e[i]];
}
for (i=1; i<=cnt-1-1; i++)
rmqq[0][i]=i;
for (i=1; i<=18; i++)
for (j=1; j<=cnt-1; j++)
{
rmqq[i][j]=rmqq[i-1][j];
if (j<=cnt-1-(1<<i))
if (rng[rmqq[i-1][j]]>rng[rmqq[i-1][j+(1<<(i-1))]])
rmqq[i][j]=rmqq[i-1][j+(1<<(i-1))];
}
for (i=1; i<=m; i++)
{
cin >>p >> q;
p=min(first[p], first[q]);
q=max(first[p], first[q]);
k=q-p+1;
t=log2[k];
rez=rmqq[t][p];
if (q-(1<<t)+1>=0)
if (rng[rmqq[t][p]]>rng[rmqq[t][q-(1<<t)+1]] and rmqq[t][q-(1<<t)+1]!=0)
rez=rmqq[t][q-(1<<t)+1];
cout << e[rez] << '\n';
}
return 0;
}