Cod sursa(job #3286204)

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

using namespace std;

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

int n;
int e[200005][20];
vector<int>a[200005];
bool marc[100005];
int euler[200005];
int niv[200005];
int first[200005];
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(niv[e[l][k]]<niv[e[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++)
        e[i][0]=euler[i];

    for(k=1;k<=17;k++)
        for(i=0;i+(1<<k)-1<nr;i++)
        {
            if(niv[e[i][k-1]]<niv[e[i+(1<<(k-1))][k-1]])
                e[i][k]=e[i][k-1];
            else
                e[i][k]=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;
}