Cod sursa(job #967470)

Utilizator dutzulBodnariuc Dan Alexandru dutzul Data 27 iunie 2013 19:28:50
Problema Lowest Common Ancestor Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.83 kb
#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;
}