Cod sursa(job #1685225)

Utilizator sicsicFMI-Coteanu Vlad sicsic Data 11 aprilie 2016 16:07:38
Problema Lowest Common Ancestor Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.82 kb
#include<fstream>
using namespace std;
ifstream f("lca.in");
ofstream g("lca.out");
#define Nmax 100000
int N,M,Euler[6*Nmax+5],Poz[Nmax+5],L[2*Nmax+5],T[Nmax+5],x,y,V[6*Nmax+5],mini,pmini;
struct lista{int nod; lista *leg;} *G[Nmax+5];
bool U[Nmax];
void adaug(int i,int j)
{
    lista *p;
    p=new lista;
    p->nod=j;
    p->leg=G[i];
    G[i]=p;
}
void citire()
{
    f>>N>>M;
    for(int i=2;i<=N;++i)
    {
        f>>T[i];
        adaug(i,T[i]);
        adaug(T[i],i);
    }
}
void DFS(int nod,int lvl)
{
    U[nod]=1;
    Euler[++Euler[0]]=nod;
    L[++L[0]]=lvl;
    Poz[nod]=Euler[0];
    for(lista *p=G[nod];p;p=p->leg)
        if(!U[p->nod])
        {
            DFS(p->nod,lvl+1);
            Euler[++Euler[0]]=nod;
            L[++L[0]]=lvl;
        }
}
void cng(int nod,int st,int dr)
{
    if(st==dr)
    {
        V[nod]=st;
        return;
    }
    int mij=(st+dr)/2;
    if(x<=mij) cng(2*nod,st,mij);
    else cng(2*nod+1,mij+1,dr);
    if(L[V[2*nod]]<L[V[2*nod+1]]) V[nod]=V[2*nod];
    else V[nod]=V[2*nod+1];
}
void getmin(int nod,int st,int dr)
{
    if(st>=x&&dr<=y)
    {
        if(L[V[nod]]<mini) mini=L[V[nod]],pmini=V[nod];
        return;
    }
    int mij=(st+dr)/2;
    if(x<=mij) getmin(2*nod,st,mij);
    if(y>mij) getmin(2*nod+1,mij+1,dr);
}
void BuildTree()
{
    for(int i=1;i<=L[0];++i)
    {
        x=i,y=L[i];
        cng(1,1,L[0]);
    }
}
void Querry()
{
    for(int i=1;i<=M;++i)
    {
        f>>x>>y;
        x=Poz[x]; y=Poz[y];
        int aux;
        if(x>y)
        {
            aux=x;
            x=y;
            y=aux;
        }
        mini=10*Nmax; pmini=0;
        getmin(1,1,L[0]);
        g<<Euler[pmini]<<'\n';
    }
}
int main()
{
    citire();
    DFS(1,0);
    BuildTree();
    Querry();
    return 0;
}