Cod sursa(job #3328265)

Utilizator StefantimStefan Timisescu Stefantim Data 7 decembrie 2025 14:04:37
Problema Lowest Common Ancestor Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.82 kb
#include <fstream>
#include <vector> 
#include <unordered_map>

using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");

struct Node{
    int val;
    vector <Node*> children;
    Node(int data)
    {
        val = data;
    }
};
const int NMAX = 1e5;
vector <Node*> tree(NMAX+5);
vector <int> idx(2*NMAX+5), lg(2*NMAX+5);
vector<vector<pair<int,int>>> rmq(20, vector<pair<int,int>>(2*NMAX + 5));
unordered_map <int, int> mp(NMAX + 5);
int cnt;

void euler(Node* node, int level)
{
    rmq[1][++cnt].first = node->val;
    rmq[1][cnt].second = level;
    mp[node->val] = cnt;
    for(auto& child: node->children)
    {
        euler(child, level + 1);
        rmq[1][++cnt].first = node->val;
        rmq[1][cnt].second = level;
    }
}
int main()
{
    int n, m, x, y;
    fin >> n >> m;

    for(int i = 1; i <= n; ++i)
        tree[i] = new Node(i);

    for(int i = 2; i <= n; ++i)
    {
        fin >> x;
        tree[x]->children.push_back(tree[i]);
    }

    euler(tree[1], 0);
    
    for(int i = 1; i <= cnt; ++i)
        lg[i] = lg[i/2] + 1;
    
    for(int k = 2; (1 << k) <= cnt; ++k)
    {
        for(int i = 1; i + (1<<k) <= cnt; ++i)
        {
            x = rmq[k-1][i].second;
            y = rmq[k-1][i + (1<<(k-1))].second;
            if(x < y)
                rmq[k][i] = rmq[k-1][i];
            else
                rmq[k][i] = rmq[k-1][i + (1<<(k-1))];
        }
    }

    for(int i = 1; i <= m; ++i)
    {
        fin >> x >> y;
        x = mp[x];
        y = mp[y];
        if(x > y)
            swap(x,y);

        int t = lg[y - x + 1] - 1;
        int minim;
        int a, b;
        a = rmq[t][x].second;
        b = rmq[t][y - (1 << t) + 1].second;
        if(a < b)
            fout << rmq[t][x].first << "\n";
        else
            fout << rmq[t][y - (1 << t) + 1].first << "\n";
    }
    return 0;
}