Pagini recente » Cod sursa (job #1484439) | Cod sursa (job #2235614) | Cod sursa (job #1990138) | Cod sursa (job #2331788) | Cod sursa (job #967472)
Cod sursa(job #967472)
#include <fstream>
using namespace std;
ifstream f("lca.in");
ofstream g("lca.out");
#include <vector>
#define LE 100666
int lev[LE],father[LE];
int logp[18][LE];
vector<int> H[LE];
bool viz[LE];
int n,i;
int lca(int nod1,int nod2) {
if (lev[nod1]<lev[nod2]) swap(nod1,nod2);
int i,diff=lev[nod1]-lev[nod2];
for(i=0; (1<<i)<=diff; ++i)
if ((1<<i)&diff)
nod1=father[logp[i][nod1]];
int levmin=lev[nod1]-1,step,l=0;
if (nod1==nod2) return nod1;
for(step=1; step<=levmin; step<<=1,++l);
for(int pos=0; step; step>>=1,--l)
if (pos+step<=levmin&&father[logp[l][nod1]]!=father[logp[l][nod2]]) {
nod1=father[logp[l][nod1]];
nod2=father[logp[l][nod2]];
pos+=step;
}
return father[nod1];
}
void dfs(int nod,int level) {
lev[nod]=level;
viz[nod]=true;
int N=H[nod].size();
for(int i=0; i<N; ++i)
if (viz[H[nod][i]]==false)
dfs(H[nod][i],level+1);
}
#define pb push_back
int m;
int main() {
f>>n>>m;
father[1]=1;
for(i=2; i<=n; ++i) {
f>>logp[1][i];
father[i]=logp[1][i];
H[i].pb(father[i]);
H[father[i]].pb(i);
}
logp[1][1]=1;
for(i=1; i<=n; ++i) logp[0][i]=i;
dfs(1,1);
for(i=2; (1<<i)<=n; ++i)
for(int j=1; j<=n; ++j)
logp[i][j]=logp[i-1][logp[1][logp[i-1][j]]];
int xx,yy;
for(i=1; i<=m; ++i) {
f>>xx>>yy;
g<<lca(xx,yy)<<'\n';
}
f.close();
g.close();
return 0;
}