Pagini recente » Cod sursa (job #2318657) | Cod sursa (job #674146) | Cod sursa (job #401855) | Cod sursa (job #2666800) | Cod sursa (job #2720489)
#include <fstream>
#include <vector>
#include <cstring>
#include <climits>
#define dim 200010
using namespace std;
vector<int> a[dim];
struct {
int val;
int indice;
}d[20][dim];
int nume[dim];
int log[dim];
int f[dim];
int i,n,k,q,t,e,st,dr;
void dfs (int nod, int nivel) {
d[0][++k].val=nivel;
d[0][k].indice=k;
nume[k]=nod;
f[nod]=k;
for (auto vecin:a[nod]) {
dfs(vecin,nivel+1);
d[0][++k].val=nivel;
d[0][k].indice=k;
nume[k]=nod;
}
}
int main() {
ifstream fin("lca.in");
ofstream fout("lca.out");
fin>>n>>q;
for (i=2;i<=n;i++) {
fin>>t;
a[t].push_back(i);
}
memset(d,INT_MAX,sizeof(d));
dfs(1,1);
for (i=2;i<=k;i++) {
log[i]=log[i/2]+1;
}
/* for (i=1;i<=k;i++) {
d[0][i]=n[i];
} */
for (e=1;e<=log[k];e++) {
for (i=1;i<=k-(1<<e)+1;i++) {
/// d[e][i]=min(d[e-1][i].val,d[e-1][i+(1<<(e-1))].val);
if (d[e-1][i].val<d[e-1][i+(1<<(e-1))].val) {
d[e][i].val=d[e-1][i].val;
d[e][i].indice=d[e-1][i].indice;
}
else {
d[e][i].val=d[e-1][i+(1<<(e-1))].val;
d[e][i].indice=d[e-1][i+(1<<(e-1))].indice;
}
}
}
for (;q--;) {
fin>>st>>dr;
st=f[st];
dr=f[dr];
if (st>dr) swap(st,dr);
int dist=dr-st+1;
e=log[dist];
if (d[e][st].val<d[e][dr-(1<<e)+1].val) {
fout<<nume[d[e][st].indice]<<"\n";
}
else {
fout<<nume[d[e][dr-(1<<e)+1].indice]<<"\n";
}
/// fout<<nume[min(d[e][st].val,d[e][dr-(1<<e)+1].val)]<<"\n";
}
return 0;
}