Cod sursa(job #2352091)

Utilizator cc4infinityCojocaru Catalin cc4infinity Data 22 februarie 2019 22:36:32
Problema Lowest Common Ancestor Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.35 kb
#include <bits/stdc++.h>

using namespace std;

ifstream fin("lca.in");
ofstream fout("lca.out");

int i,j,m,poz,n,x,y,b,lg[300003],t[200005],h[200005],a[100003];
// h= nivelul nodului i in parcurgere
// t= parcurgerea lui euler
// a=prima aparitie a nodilui i in parcurgere
// r= tabelul de rmq
vector<int> f[100001];

struct abc
{
    int v,pz;
}r[18][100003];

void eul(int nod,int H)
{
    i++;
    t[i]=nod;
    h[i]=H;
    if (!a[nod]) a[nod]=i;
    int l=f[nod].size();
    for (int j=0;j<l;j++)
        {eul(f[nod][j],H+1);
        h[++i]=H; t[i]=nod;}
}

int main()
{
    fin>>n>>m;
    for (i=2;i<=n;i++)
    {
        fin>>x;
        f[x].push_back(i);
    }
    i=0;
    eul(1,0);
    poz=i;
    for (i=1;i<=poz;i++)
        {r[0][i].v=h[i]; r[0][i].pz=t[i];}
    for (i=2;i<=n*3;i++) lg[i]=lg[i/2]+1;
    for (i=1;(1 << i)<=poz;i++)
      for (j=1;j+(1<<i)-1<=poz;j++)
        if (r[i-1][j].v<r[i-1][j+(1<<(i-1))].v)
                                             r[i][j]=r[i-1][j];
                                        else r[i][j]=r[i-1][j+(1<<(i-1))];
    for (i=1;i<=m;i++)
    {
        fin>>x>>y;
        x=a[x];
        y=a[y];
        if (y<x) swap(x,y);
        int z=lg[y-x];
        if (r[z][x].v<r[z][y-(1<<z)].v) fout<<r[z][x].pz<<"\n"; else fout<<r[z][y-(1<<z)].pz<<"\n";
    }
    return 0;
}