Cod sursa(job #2926855)

Utilizator KarinaDKarina Dumitrescu KarinaD Data 18 octombrie 2022 20:30:32
Problema Stramosi Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.42 kb
#include <fstream>
#include <vector>

using namespace std;

ifstream fin("stramosi.in");
ofstream fout("stramosi.out");

#define MAXN 250000
#define LOG_MAXN 20

struct nod {
    int d;
    int par[LOG_MAXN];
    std::vector <int> chd;
};

nod web[MAXN];

void init(int pos, int par) {
    web[pos].par[0] = par;

    int i = 1;
    for(; i < LOG_MAXN && web[pos].par[i - 1] != -1; i++)
        web[pos].par[i] = web[ web[pos].par[i - 1] ].par[i-1];
    for(; i < LOG_MAXN; i++)
        web[pos].par[i] = -1;

    if ( par != -1 )
        web[pos].d = web[par].d + 1;
    else
        web[pos].d = 0;

    for ( int i = 0; i < web[pos].chd.size (); i++ )
        init ( web[pos].chd[i], pos );
}

int parent(int pos, int depth) {

    for(int i = LOG_MAXN - 1; i >= 0 && pos != -1; i--) {
        if (depth >= (1 << i)) {
            pos = web[pos].par[i];
            depth -= 1 << i;
        }
    }
    return pos;
}

int main() {
    vector <int> roots;

    int nrn, nrq;
    int par, pos, depth;
    fin >> nrn >> nrq;
    for(int i = 0; i < nrn; i++) {
        fin >> par;
        if(par == 0) {
            roots.push_back(i);
        }
        else {
            web[--par].chd.push_back(i);
        }
    }
    for(int i = 0; i < roots.size(); i++) {
        init(roots[i], -1);
    }
    for(int i = 0; i < nrq; i++) {
        fin >> pos >> depth;
        pos--;
        fout << parent(pos, depth) + 1 << '\n';
    }
    
    return 0;
}