Cod sursa(job #2357771)

Utilizator bodea.georgianaBodea Georgiana bodea.georgiana Data 27 februarie 2019 18:41:21
Problema Lowest Common Ancestor Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.57 kb
#include <cstdio>
#define N 100002
#include <vector>

using namespace std;
FILE *f,*g;

int rmq[18][2*N],nivel[N],where[N],nr,log[N];
vector <int> fiu[N];

void RMQ()
{///rmq[i][j] memorez nodul de pe nivelul cel mai mic din intervalul (j,j+2^i-1)
    int poz=1,n1,n2;
    for(int i=1;i<=log[nr];++i)
    {
        for(int j=1;j+poz<=nr;++j)
        {
            n1=nivel[rmq[i-1][j]];
            n2=nivel[rmq[i-1][j+poz]];
            if(n1<n2)
                rmq[i][j]=rmq[i-1][j];
            else
                rmq[i][j]=rmq[i-1][j+poz];
        }
        poz*=2;
    }
}
void dfs(int nod)
{
    rmq[0][++nr]=nod;
    where[nod]=nr;///memorez prima aparitie a fiecarui nod
    for(int i=0;i<fiu[nod].size();++i)
    {
        nivel[fiu[nod][i]]=nivel[nod]+1;
        dfs(fiu[nod][i]);
        rmq[0][++nr]=nod;
    }
}
int main()
{
    f=fopen("lca.in","r");
    g=fopen("lca.out","w");
    int m,n;
    fscanf(f,"%d %d",&n,&m);
    int x,y;
    for(int i=2;i<=n;++i)
    {
        fscanf(f,"%d",&x);
        fiu[x].push_back(i);
    }
    dfs(1);
    for(int i=2;i<=nr;++i)
        log[i]=log[i/2]+1;
    RMQ();
    int poz,dif,val,px,py,lin;
    for(int i=1;i<=m;++i)
    {
        fscanf(f,"%d %d",&x,&y);
        px=where[x];
        py=where[y];
        if(px>py)
            swap(px,py);
        dif=py-px+1;
        lin=log[dif];
        poz=(1<<lin);
        if(nivel[x]<nivel[y])
            val=rmq[lin][px];
        else
            val=rmq[lin][py-poz+1];
        fprintf(g,"%d\n",val);
    }
    return 0;
}