Cod sursa(job #2030512)

Utilizator AlisRinja Alis Alis Data 1 octombrie 2017 18:37:48
Problema Lowest Common Ancestor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.67 kb
#include<bits/stdc++.h>
using namespace std;
const int nmax=1e5+5;
vector<int> gf[nmax];
int nivel[nmax];
int tata[nmax];
int sqrtH;
void dfs(int nod){
    for(int i=0;i<gf[nod].size();i++){
        int vecin=gf[nod][i];
        tata[vecin]=nod;
        nivel[vecin]=nivel[nod]+1;
        dfs(vecin);
    }
}
int tata2[nmax];
void dfsStramos(int nod,int stramos){
    tata2[nod]=stramos;
    if(nivel[nod]%sqrtH==0){
        stramos=nod;
    }
    for(int i=0;i<gf[nod].size();i++){
        int vecin=gf[nod][i];
        dfsStramos(vecin,stramos);
    }
}
int query(int x,int y){
    while(tata2[x]!=tata2[y]){
        if(nivel[x]>nivel[y]){
            x=tata2[x];
        }
        else{
            y=tata2[y];
        }
    }
    //au ajuns in acelasi interval
    //le aduc la acelasi nivel
    if(nivel[x]<nivel[y]){
        swap(x,y);
    }
    //x trebuie adus la nivelul lui y
    while(nivel[x]!=nivel[y]){
        x=tata[x];
    }
    //sunt la acelasi nivel le cautam tatal
    while(x!=y){
        x=tata[x];
        y=tata[y];
    }
    return x;
}
int main(){
    ifstream cin("lca.in");
    ofstream fout("lca.out");
    int n,m;
    cin>>n>>m;
    for(int i=2;i<=n;i++){
        int x;
        cin>>x;
        gf[x].push_back(i);
    }
    nivel[1]=1;
    dfs(1);
    int h=0;
    for(int i=1;i<=n;i++){
        h=max(h,nivel[i]);
    }
    cout<<h<<"\n";
    sqrtH=sqrt(h);
    cout<<sqrtH<<"\n";
    int stramos=0;
    dfsStramos(1,stramos);
    for(int i=1;i<=n;i++){
        cout<<tata2[i]<<" ";
    }
    for(int i=0;i<m;i++){
        int x,y;
        cin>>x>>y;
        fout<<query(x,y)<<"\n";
    }
}