Cod sursa(job #1853340)

Utilizator GeanaVladGeana Vlad GeanaVlad Data 21 ianuarie 2017 18:00:03
Problema Lowest Common Ancestor Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.86 kb
#include <iostream>
#include<fstream>
#include<vector>
#define inf 1000000
using namespace std;
ifstream f("lca.in");
ofstream g("lca.out");
int sz,n,i,x,q,st[100000],tt[100001],lev[100001],a[100000],tree[10000],p_a[100000],y,qls,qld,poz[100000];
vector<int>v[100001];
void buildtree(int poz,int ls,int ld)
{
    if(ls==ld)
    {
        tree[poz]=ls;
        return;
    }
    int mij=(ls+ld)/2;
    buildtree(2*poz,ls,mij);
    buildtree(2*poz+1,mij+1,ld);
    if(a[tree[2*poz]] < a[tree[2*poz+1]])
        tree[poz]=tree[2*poz];
    else tree[poz]=tree[2*poz+1];
    //tree[poz]=min(tree[2*poz],tree[2*poz+1]);
}
int interogate(int poz,int ls,int ld)
{
    if(qls<=ls && qld>=ld)
        return tree[poz];
    if(qls>ld || qld<ls)
        return 0;
    int mij=(ls+ld)/2;
    if(a[interogate(2*poz,ls,mij)] < a[interogate(2*poz+1,mij+1,ld)])
        return interogate(2*poz,ls,mij);
    else
        return interogate(2*poz+1,mij+1,ld);
    //return min(interogate(2*poz,ls,mij),interogate(2*poz+1,mij+1,ld));
}
void parc_euler(int nod)
{
    st[++sz]=nod;
    for(int k=0;k<v[nod].size();k++)
    {
        parc_euler(v[nod][k]);
        st[++sz]=nod;
    }
}
void dfs(int nod,int niv)
{
    lev[nod]=niv;
    for(int k=0;k<v[nod].size();k++)
        dfs(v[nod][k],niv+1);
}
int main()
{
    f>>n>>q;
    for(i=2;i<=n;i++)
    {
        f>>x;
        tt[i]=x;
        v[x].push_back(i);
    }
    parc_euler(1);
    for(i=1;i<=sz;i++)
        if(!p_a[st[i]])
            p_a[st[i]]=i;
    for(i=1;i<=sz;i++)
        poz[st[i]]=i;
    dfs(1,1);
    for(i=1;i<=sz;i++)
        a[i]=lev[st[i]];
    buildtree(1,1,sz);
    a[0]=inf;
    for(i=1;i<=q;i++)
    {
        f>>qls>>qld;
        qls=p_a[qls];
        qld=p_a[qld];
        if(qls>qld)
            swap(qls,qld);
        g<<st[interogate(1,1,sz)]<<'\n';
    }
}