Cod sursa(job #3178223)

Utilizator Robert_MitriRobert Mitri Robert_Mitri Data 1 decembrie 2023 13:47:31
Problema Stramosi Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.05 kb
#include <fstream>
#include <vector>
#define sz 250000
using namespace std;
ifstream fin("stramosi.in");
ofstream fout("stramosi.out");

int n,m;

int r[19][sz+5];

vector <int> v[sz+5];

int xbound[sz+5];
int ybound[sz+5];


int o;
void dfs(int nod)
{
    o++;
    xbound[nod]=o;
    for(auto& i : v[nod])
        dfs(i);
    o++;
    ybound[nod]=o;
}

void preprocess()
{
    for(int p = 1;(1<<p)<=n;p++)
        for(int i = 1; i<=n;i++)
            r[p][i] = r[p-1][r[p-1][i]];
}
bool is_ancestor(int ancestor,int kid)
{
    return xbound[kid]>xbound[ancestor] && ybound[kid]<ybound[ancestor];
}


int get_ancestor(int nod,int val)
{
    for(int i=18;i>=0;i--)
    {
        if(val >= (1<<i))
            nod=r[i][nod],val-=(1<<i);
    }
    return nod;
}


int main()
{
    fin>>n>>m;
    for(int i=1;i<=n;i++)
        fin>>r[0][i],v[r[0][i]].push_back(i);
    dfs(0);
    preprocess();
    for(int i=1;i<=m;i++)
    {
        int x,y;
        fin>>x>>y;
        fout<<get_ancestor(x,y)<<'\n';
    }
}