Cod sursa(job #2124436)

Utilizator albucristianAlbu Cristian-Gabriel albucristian Data 7 februarie 2018 11:03:44
Problema Lowest Common Ancestor Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.52 kb
#include <fstream>
#include <vector>
#include <cmath>
#define inf 0x3f3f3f3f3f3f
using namespace std;
ifstream in("lca.in");
ofstream out("lca.out");
vector <int> graf[100002];
int fr[100002],niv[100002],lo[100002];
int n,m,nn,i,j,x,l,t,mm,k,a,b;
struct str
{
    int val,poz;
}rmq[22][400002];
void DFS(int nod,int tata)
{
    rmq[0][++nn]={niv[nod],nod};
    if(!fr[nod])
        fr[nod]=nn;
    for (x=0;x<graf[nod].size();x++)
    {
        if(graf[nod][x]!=tata&&niv[graf[nod][x]]==0)
        {
            niv[graf[nod][x]]=niv[nod]+1;
            DFS(graf[nod][x],nod);
        }
    }
    rmq[0][++nn]={niv[tata],tata};
}
void RMQ()
{
    mm=lo[nn];
    k=1;
    for(i=1;i<=mm;i++)
    {
        for(j=1;j+k<=nn;j++)
        {
            if(rmq[i-1][j].val>rmq[i-1][j+k].val)
            {
                rmq[i][j]=rmq[i-1][j];
            }
            else
            {
                rmq[i][j]=rmq[i-1][j+k];
            }
        }
    }
}
int intreb(int a,int b)
{
    l=lo[b-a+1];
    t=pow(2,l);
    if(rmq[l][a].poz<rmq[l][b-t+1].poz)
        return rmq[l][a].poz;
    else
        return rmq[l][b-t+1].poz;
}
int main()
{
    in>>n>>m;
    for(i=1;i<n;i++)
    {
        in>>x;
        graf[i].push_back(x);
        graf[x].push_back(i);
    }
    niv[1]=1;
    DFS(1,1);
    for(i=2;i<=nn;i++)
        lo[i]=lo[i/2]+1;
    RMQ();
    for(i=1;i<=m;i++)
    {
        in>>a>>b;
        out<<intreb(min(fr[a],fr[b]),max(fr[a],fr[b]))<<"\n";
    }
    return 0;
}