Pagini recente » Borderou de evaluare (job #432886) | Borderou de evaluare (job #2938961) | Borderou de evaluare (job #2510193) | Borderou de evaluare (job #521504) | Cod sursa (job #2165127)
#include <bits/stdc++.h>
using namespace std;
ifstream f("lca.in");
ofstream g("lca.out");
vector<int> v[100005];
int n,mm,m[200005][30],a[200005],nrt,viz[200005],w[200005],b[200005];
int interog(int x,int y) {
int k=log2(y-x+1);
if (a[m[x][k]]<a[m[y-(1<<k)+1][k]])
return w[m[x][k]];
return w[m[y-(1<<k)+1][k]];
}
void df(int k,int nrniv) {
int i;
w[++nrt]=k;
b[k]=nrt;
a[nrt]=nrniv;
viz[k]=1;
for (i=0;i<v[k].size();i++)
if (!viz[v[k][i]]) {
df(v[k][i],nrniv+1);
w[++nrt]=k;
a[nrt]=nrniv;
b[k]=nrt;
}
}
int main() {
int i,j,x,y;
f>>n>>mm;
for (i=2;i<=n;i++) {
f>>x;
v[x].push_back(i);
}
df(1,0);/*
for (i=1;i<=nrt;i++)
cout<<w[i]<<' ';
cout<<'\n';
for (i=1;i<=nrt;i++)
cout<<a[i]<<' ';
cout<<'\n';
for (i=1;i<=n;i++)
cout<<b[i]<<' ';*/
for (i=1;i<=nrt;i++)
m[i][0]=i;
for (j=1;(1<<j)<=nrt;j++)
for (i=1;i<=nrt-(1<<j)+1;i++)
if (a[m[i][j-1]]<a[m[i+(1<<(j-1))][j-1]])
m[i][j]=m[i][j-1];
else
m[i][j]=m[i+(1<<(j-1))][j-1];
for (i=1;i<=mm;i++) {
f>>x>>y;
if (b[x]<b[y])
g<<interog(b[x],b[y])<<'\n';
else
g<<interog(b[y],b[x])<<'\n';
}
return 0;
}