Cod sursa(job #2371605)

Utilizator ianiIani Biro iani Data 6 martie 2019 18:36:03
Problema Lowest Common Ancestor Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.17 kb
#include <iostream>
#include <fstream>

#define NMAX 100005
#define INF 2000000000

using namespace std;

struct elem
{
    int val,niv;

    bool operator <(const elem& x2) const
    {
        return niv<x2.niv;
    }
} tree[NMAX*8];

struct up
{
    int poz;
    elem val;
} update;

struct q
{
    int start,finish;
} query;

struct nod
{
    int fiu;
    nod* next;
}*a[NMAX];

int n,euler[NMAX*2],neuler,nivel[NMAX*2],first[NMAX];;

void runupdate(int st,int dr,int postree)
{
    if (st==dr)
    {
        tree[postree]=update.val;
        return;
    }
    int mij=(st+dr)/2;
    if (update.poz<=mij)
        runupdate(st,mij,2*postree);
    else
        runupdate(mij+1,dr,2*postree+1);
    tree[postree]=min(tree[2*postree],tree[2*postree+1]);
}

elem runquery(int st,int dr,int postree)
{
    if (st>=query.start&&dr<=query.finish)
        return tree[postree];
    if (st>query.finish||dr<query.start)
    {
        elem aux;
        aux.val=INF;
        aux.niv=INF;
        return aux;
    }
    int mij=(st+dr)/2;
    return min(runquery(st,mij,2*postree),runquery(mij+1,dr,2*postree+1));
}

void dfs(int x,int niv)
{
    euler[++neuler]=x;
    nivel[neuler]=niv;
    first[x]=neuler;
    for (nod *i=a[x]; i; i=i->next)
    {
        dfs(i->fiu,niv+1);
        euler[++neuler]=x;
        nivel[neuler]=niv;
    }
}

int main()
{
    ifstream fin ("lca.in");
    ofstream fout ("lca.out");
    int m;
    fin>>n>>m;
    for(int i=1; i<n; i++)
    {
        int x;
        fin>>x;
        nod* nou=new nod;
        nou->fiu=i+1;
        nou->next=a[x];
        a[x]=nou;
    }
    dfs(1,0);
    for (int i=1; i<=neuler; i++)
    {
        elem aux;
        aux.val=euler[i];
        aux.niv=nivel[i];
        update.val=aux;
        update.poz=i;
        runupdate(1,neuler,1);
    }
    for (int i=1; i<=m; i++)
    {
        int x,y;
        fin>>x>>y;
        query.start=first[x];
        query.finish=first[y];
        if (query.start>query.finish)
            swap(query.start,query.finish);
        elem da=runquery(1,neuler,1);
        fout<<da.val<<'\n';
    }
    return 0;
}