Cod sursa(job #2795765)

Utilizator RobertAcAcatrinei Robert-Marian RobertAc Data 6 noiembrie 2021 22:31:04
Problema Lowest Common Ancestor Scor 90
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.52 kb
#include <bits/stdc++.h>
#define nmax 100005*4
using namespace std;
string prob="lca";
ifstream in(prob+".in");
ofstream out(prob+".out");
int lg[nmax];
int n,m;
int s=1;
int f[nmax];
struct nod{
    vector<nod*> v;
    int ind;
} noduri[nmax];

struct node{
    int d,i;
    node(int depth=0,int index=0){
        d=depth;
        i=index;
    }
    bool operator <(node other){
        return d<other.d;
    }
} rmq[32][nmax];

node minn(node one,node two){
    if(one<two)return one;
    return two;
}

void dolg(){
    for(int i=2;i<nmax;i++)lg[i]=lg[i>>1]+1;
}

void input(){
    in>>n>>m;
    noduri[1].ind=1;
    for(int i=2;i<=n;i++){
        int nr;
        in>>nr;
        noduri[i].ind=i;
        noduri[nr].v.push_back(&noduri[i]);
    }
}

void dfs(nod *k,int depth){
    f[k->ind]=s;
    rmq[0][s++]=node(depth,k->ind);
    for(auto i:k->v){
        dfs(i,depth+1);
        f[k->ind]=s;
        rmq[0][s++]=node(depth,k->ind);
    }
}

void dormq(){
    for(int i=1;(1<<i)<=s;i++){
        for(int j=1;j+(1<<i)<=s;j++){
            rmq[i][j]=minn(rmq[i-1][j],rmq[i-1][j+(1<<(i-1))]);
        }
    }
}

void doqueries(){
    int a,b;
    for(int i=0;i<m;i++){
        in>>a>>b;
        a=f[a];
        b=f[b];
        if(a>b)swap(a,b);
        int ss=b-a+1;
        node minnn=minn(rmq[lg[ss]][a],rmq[lg[ss]][b-(1<<lg[ss])+1]);
        out<<minnn.i<<'\n';
    }
}

int main(){
    dolg();
    input();
    dfs(&noduri[1],0);
    dormq();
    doqueries();
}