Cod sursa(job #3149811)

Utilizator tudor_costinCostin Tudor tudor_costin Data 12 septembrie 2023 19:56:55
Problema Lowest Common Ancestor Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.95 kb
#include <vector>
#include <cmath>
#include <fstream>
using namespace std;
ifstream cin("lca.in");
ofstream cout("lca.out");
const int Nmax=200005,Mmax=700005;
int rmq[Mmax][25];
int depth[Nmax],poz[Nmax];
vector<int> v[Nmax],e;
void euler(int i,int d,int prev)
{
    depth[i]=d;
    e.push_back(i);
    poz[i]=e.size()-1;
    for(int j=0;j<v[i].size();j++)
    {
        if(v[i][j]!=prev)
        {
            euler(v[i][j],d+1,i);
            e.push_back(i);
        }
    }
    return;
}
int lca(int i,int j)
{
    i=poz[i];
    j=poz[j];
    if(i>j)
    {
        int aux=j;
        j=i;
        i=aux;
    }
    int x=log2(j-i+1);
    int fhalf=depth[e[rmq[i][x]]];
    int shalf=depth[e[rmq[j-(1<<x)+1][x]]];
    if(fhalf<=shalf)
    {
        return e[rmq[i][x]];
    }
    else
    {
        return e[rmq[j-(1<<x)+1][x]];
    }
}
int main()
{
    int n,m,x,y;
    cin>>n>>m;
    for(int i=1;i<=n-1;i++)
    {
        cin>>x>>y;
        v[y].push_back(x);
        ///v[y].push_back(x);
    }
    euler(1,0,0);
    int n1=e.size();
    for(int i=0;i<n1;i++)
    {
        rmq[i][0]=i;
    }
    for(int p=1;p<=log2(n1);p++)
    {
        for(int i=0;i<n1;i++)
        {
            int fhalf=depth[e[rmq[i][p-1]]];
            int shalf=depth[e[rmq[i+(1<<(p-1))][p-1]]];
            if(fhalf<=shalf)
            {
                rmq[i][p]=rmq[i][p-1];
            }
            else
            {
                rmq[i][p]=rmq[i+(1<<(p-1))][p-1];
            }
        }
    }
    int k,l;
    for(int i=1;i<=m;i++)
    {
        cin>>k>>l;
        cout<<lca(k,l)<<'\n';
        /*int tlca=0;
        for(int j=1;j<=k;j++)
        {
            cin>>x;
            if(depth[x]>1)
            {
                if(tlca==0) tlca=x;
                else tlca=lca(tlca,x);
            }
        }
        if(tlca==1) cout<<"NO"<<'\n';
        else cout<<"YES"<<'\n';*/
    }
    return 0;
}