Cod sursa(job #3285991)

Utilizator rarest@yahoo.comtorcea rares [email protected] Data 13 martie 2025 17:26:46
Problema Lowest Common Ancestor Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.49 kb
#include <bits/stdc++.h>

using namespace std;

ifstream f("lca.in");
ofstream g("lca.out");

int n;
int m[100001][18];
int e[100001][18];
vector<int>a[100001];
bool marc[100001];
int euler[100001];
int niv[100001];
int first[100001];
int nivel[100001];
int nr;

void dfs(int k)
{
    int i;
    marc[k]=1;
    if(first[k]==0)
    first[k]=nr+1;
    euler[++nr]=k;
    for(i=0;i<a[k].size();i++)
    {
        if(marc[a[k][i]]==0)
        {
            niv[a[k][i]]=niv[k]+1;
            dfs(a[k][i]);
            euler[++nr]=k;
        }
    }
}

int query(int l,int r)
{
    int lenght=r-l+1;
    int k=0;
    while((1<<(k+1))<=lenght)
        k++;

    if(m[l][k]<m[r-(1<<k)+1][k])
    return e[l][k];
    else
        return e[r-(1<<k)+1][k];
}

int main()
{
    f>>n;
    int i,j,k;
    int x,y;
    for(i=1;i<=n-1;i++)
    {
        f>>x>>y;
        a[x].push_back(y);
        a[y].push_back(x);
    }
    dfs(1);
    for(i=1;i<=nr;i++)
    {
        nivel[i]=niv[euler[i]];
        m[i][0]=nivel[i];
        e[i][0]=euler[i];
    }

    for(k=1;k<17;k++)
        for(i=0;i+(1<<k)-1<nr;i++)
        {
            m[i][k]=min(m[i][k-1],m[i+(1<<k-1)][k-1]);
            e[i][k]=min(e[i][k-1],e[i+(1<<k-1)][k-1]);
        }


    int q;
    f>>q;
    for(i=1;i<=q;i++)
    {
        f>>x>>y;
        int st,dr;
        st=min(first[x],first[y]);
        dr=max(first[x],first[y]);
        g<<query(st,dr)<<endl;
    }
    return 0;
}