Cod sursa(job #2499433)

Utilizator denmirceaBrasoveanu Mircea denmircea Data 26 noiembrie 2019 08:21:14
Problema A+B Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.3 kb
#include <bits/stdc++.h>
#define dim 200010
using namespace std;
int prim[dim],E[dim],N[dim],k,nivel=1,n,m,i,x,lun,lungime,j,y;
short Log[dim];
vector <int> L[dim];
int rmq[18][dim];
void dfs(int nod,int tata)
{
    prim[nod]=++k;
    E[k]=nod;
    N[k]=nivel;
    for(int i=0; i<L[nod].size(); i++)
    {
        if(L[nod][i]==tata)
            continue;
        nivel++;
        dfs(L[nod][i],nod);
        nivel--;
        E[++k]=nod;
        N[k]=nivel;
    }
}
void query(int x,int y){
if(x>y)
    swap(x,y);
int put=Log[y-x+1];
cout<< min(rmq[put][x],rmq[put][y-put+1])<<"\n";
}
int main()
{
    cin>>n>>m;
    for(i=2; i<=n; i++)
    {
        cin>>x;
        L[x].push_back(i);
        L[i].push_back(x);
    }
    dfs(1,0);
    /// fac rmq
    for(i=1; i<=k; i++)
        rmq[0][i]=N[i];
    for(lun=1; lun<=17; lun++)
    {
        lungime=(1<<lun);
        lungime/=2;
        for(j=1; j<=k; j++)
        {
            rmq[lun][j]=min(rmq[lun-1][j],rmq[lun-1][j+lungime]);
            cout<<rmq[lun][j]<<" ";
        }
        cout<<endl;
    }
    Log[1]=1;
    Log[2]=1;
    for(i=3; i<=n; i++)
        Log[i]=1+Log[i/2];
    for(i=1; i<=m; i++)
    {
        cin>>x>>y;
        //cout<<prim[x]<<" "<<prim[y]<<" --\n";
        query(prim[x],prim[y]);
    }
}