Pagini recente » Cod sursa (job #2154978) | Cod sursa (job #999106) | Cod sursa (job #2353960) | Cod sursa (job #1380009) | Cod sursa (job #967470)
Cod sursa(job #967470)
#include <iostream>
#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];
cout<<diff<<'\n';
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;
cout<<nod1<<" "<<nod2<<" "<<levmin<<'\n';
for(step=1; step<=levmin; step<<=1,++l);
cout<<l<<'\n';
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=1;i<=n;++i) cout<<logp[1][i]<<" " ;
cout<<'\n';
for(i=1;i<=n;++i) cout<<lev[i]<<" ";
cout<<'\n';
for(i=2; (1<<i)<=n; ++i,cout<<'\n')
for(int j=1; j<=n; ++j)
cout<<(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;
}