Cod sursa(job #2565461)

Utilizator Raresr14Rosca Rares Raresr14 Data 2 martie 2020 14:16:32
Problema Lowest Common Ancestor Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.43 kb
#include <fstream>
#include <vector>
#include <bitset>
#define DIM 100010
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
int n,m,i,T[DIM],w[DIM],k,f[DIM],l1,l,nr,x,y,f2[DIM];
vector<int> L[DIM];
bitset<100010> f1;
void dfs(int nod, int niv){
    f[nod]=1;
    w[++k]=nod;
    for(int i=0;i<L[nod].size();i++){
        int vec=L[nod][i];
        if(f[vec]==0){
            dfs(vec,niv+1);
        }
    }
    if(L[nod].size()==1)
        f2[nod]=1;
    w[++k]=nod;
}
int main(){
    fin>>n>>m;
    for(i=2;i<=n;i++){
        fin>>T[i];
        L[T[i]].push_back(i);
        L[i].push_back(T[i]);
    }
    dfs(1,1);
    for(int j=1;j<=m;j++){
        fin>>x>>y;
        nr=2;
        l1=l=0;
        f1.reset();
        for(i=1;i<=k&&nr;i++){
            if(f1[w[i]]==0){
                if(w[i+1]==w[i]){
                    i++;
                    if(w[i]==x||w[i]==y)
                        nr--;
                    continue;
                }
                f1[w[i]]=1;
                if(l){
                    l1=l;
                    l=w[i];
                }else
                    l=w[i];
                continue;
            }
            if(f1[w[i]]){
                f1[w[i]]=0;
                if(w[i]==x||w[i]==y)
                    nr--;
                l=l1;
                continue;
            }
        }
        fout<<l<<"\n";
    }

    return 0;
}