Cod sursa(job #2332989)

Utilizator AndreiDeltaBalanici Andrei Daniel AndreiDelta Data 31 ianuarie 2019 16:01:29
Problema Lowest Common Ancestor Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.42 kb
#include <bits/stdc++.h>
#define Dim 100006
using namespace std;
ifstream f("lca.in");
ofstream g("lca.out");
int N,M,a,b,MIN[Dim],MAX[Dim],nr;
bool viz[Dim];

struct vertex
{
    int A,B,Vf;
}R[Dim];

vector <int> V[Dim];
set < pair<int,int> > S;
set < pair<int,int> > ::iterator it;

void DFS(int nod)
{
    viz[nod]=1;
    ++nr;
    MIN[nod]=nr;
    for(unsigned int i=0;i<V[nod].size();i++)
    {
        int vecin=V[nod][i];
        if(!viz[vecin]) DFS(vecin);
    }
    MAX[nod]=max(MAX[nod],nr);
}

bool tester(vertex X,vertex Y)
{
    if(X.B<Y.B) return 1;
    else
    if(X.B==Y.B)
    {
        if(X.A>Y.A) return 1;
        else return 0;
    }
    else return 0;
}


int main()
{
    f>>N>>M;
    for(int i=1;i<N;i++)
    {
       f>>a;
       V[a].push_back(i+1);
    }
    DFS(1);
    for(int i=1;i<=N;i++)
    {
        R[i].Vf=i;
        R[i].A=MIN[i];
        R[i].B=MAX[i];
    }
    sort(R+1,R+N+1,tester);
    for(int i=1;i<=N;i++)
        S.insert({R[i].B,i});
    for(int i=1;i<=M;i++)
    {
        f>>a>>b;
        it=S.lower_bound({MAX[b],1});
        int poz=it->second;
        bool stop=1;
        while(stop==1)
        {
            if(R[poz].B!=R[it->second].B) stop=0;
            if(R[poz].A<=MIN[a])
            {
                g<<R[poz].Vf<<'\n';
                stop=0;
            }
            poz++;
        }
    }
    return 0;
}