Cod sursa(job #2469001)

Utilizator NashikAndrei Feodorov Nashik Data 6 octombrie 2019 13:24:46
Problema Lowest Common Ancestor Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.83 kb
//#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
vector<int> v[100005];
int q[200005],cnt=0,f[100005],lvl[200005],n,m,a,rmq[200005][20];
void dfs(int nod,int niv){
    q[++cnt]=nod;
    if(f[nod]==0){
        f[nod]=cnt;
        //cout<<"{"<<nod<<" "<<cnt<<"}";
    }
    lvl[cnt]=niv;
    for(int i=0;i<v[nod].size();i++){
        dfs(v[nod][i],niv+1);
        q[++cnt]=nod;
        lvl[cnt]=niv;
    }
}
int log(long long x)
{
    return 64 - __builtin_clzll(x) - 1;
}
int main()
{
    ifstream cin("lca.in");
    ofstream cout("lca.out");
    cin>>n>>m;
    for(int i=2;i<=n;i++){
        cin>>a;
        v[a].push_back(i);
    }
    dfs(1,0);
    //cout<<"\n";
    //for(int i=1;i<=cnt;i++){
        //cout<<q[i]<<" ";
    //}
    //cout<<"\n";
    for(int i=1;i<=cnt;i++){
        //cout<<lvl[i]<<" ";
        rmq[i][0]=i;
    }
    //cout<<"\n\n";
    for(int j=1;(1<<j)<=cnt;j++){
        for(int i=1;i+(1<<j)<=cnt;i++){
            if(lvl[rmq[i][j-1]]<lvl[rmq[i+(1<<(j-1))][j-1]]){
                rmq[i][j]=rmq[i][j-1];
            }
            else{
                rmq[i][j]=rmq[i+(1<<(j-1))][j-1];
            }
        }
    }
    //for(int i=1;i<=cnt;i++){
        //for(int j=0;(1<<j)<=cnt and i+(1<<j)-1<=cnt;j++){
            //cout<<rmq[i][j]<<" ";
        //}
        //cout<<"\n";
    //}
    //cout<<"\n\n\n\n\n";
    int a,b,dist;
    for(int i=1;i<=m;i++){
        cin>>a>>b;
        a=f[a];
        b=f[b];
        //cout<<a<<" "<<b<<" ";
        dist=b-a+1;
        dist=log(dist);
        //cout<<dist<<"-=-=";
        if(lvl[rmq[a][dist]]<lvl[rmq[b-(1<<dist)+1][dist]]){
            cout<<rmq[a][dist]<<"--"<<q[rmq[a][dist]]<<"\n";
        }
        else{
            cout<<rmq[b-(1<<dist)+1][dist]<<"--"<<q[rmq[b-(1<<dist)+1][dist]]<<"\n";
        }
    }
    return 0;
}
///1 2 4 7 4 8 4 2 5 2 6 9 6 2 1 3 10 3 11 3 1