Cod sursa(job #2720487)

Utilizator mihnea03Ciocioiu Mihnea mihnea03 Data 10 martie 2021 21:32:02
Problema Lowest Common Ancestor Scor 30
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.76 kb
#include <fstream>
#include <vector>
#include <cstring>
#include <climits>
#define dim 100010
using namespace std;
vector<int> a[dim];
struct {
    int val;
    int indice;
}d[20][dim];
int nume[dim];
int log[dim];
int f[dim];
int i,n,k,q,t,e,st,dr;

void dfs (int nod, int nivel) {
    d[0][++k].val=nivel;
    d[0][k].indice=k;
    nume[k]=nod;
    f[nod]=k;
    for (auto vecin:a[nod]) {
        dfs(vecin,nivel+1);
        d[0][++k].val=nivel;
        d[0][k].indice=k;
        nume[k]=nod;
    }
}

int main() {
    ifstream fin("lca.in");
    ofstream fout("lca.out");
    fin>>n>>q;
    for (i=2;i<=n;i++) {
        fin>>t;
        a[t].push_back(i);
    }
    memset(d,INT_MAX,sizeof(d));
    dfs(1,1);
    for (i=2;i<=k;i++) {
        log[i]=log[i/2]+1;
    }
  /*  for (i=1;i<=k;i++) {
        d[0][i]=n[i];
    } */
    for (e=1;e<=log[k];e++) {
        for (i=1;i<=k-(1<<e)+1;i++) {
          ///  d[e][i]=min(d[e-1][i].val,d[e-1][i+(1<<(e-1))].val);
            if (d[e-1][i].val<d[e-1][i+(1<<(e-1))].val) {
                d[e][i].val=d[e-1][i].val;
                d[e][i].indice=d[e-1][i].indice;
            }
            else {
                d[e][i].val=d[e-1][i+(1<<(e-1))].val;
                d[e][i].indice=d[e-1][i+(1<<(e-1))].indice;
            }
        }
    }
    for (;q--;) {
        fin>>st>>dr;
        st=f[st];
        dr=f[dr];
        if (st>dr) swap(st,dr);
        int dist=dr-st+1;
        e=log[dist];
        if (d[e][st].val<d[e][dr-(1<<e)+1].val) {
            fout<<nume[d[e][st].indice]<<"\n";
        }
        else {
            fout<<nume[d[e][dr-(1<<e)+1].indice]<<"\n";
        }
      ///  fout<<nume[min(d[e][st].val,d[e][dr-(1<<e)+1].val)]<<"\n";
    }
    return 0;
}