Cod sursa(job #3180639)

Utilizator dragoncrackCandidatu Mario Luca dragoncrack Data 5 decembrie 2023 18:11:29
Problema Stramosi Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.1 kb
#include <fstream>
#define DIM 250005

using namespace std;

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

int n, m;
int stramosi[DIM][22];
int E[DIM];
int powersOf2[22];

void initE() {
    for (int i = 2; i < DIM; i++) {
        E[i] = E[i / 2] + 1;
    }
}

void initPowersOf2() {
    powersOf2[0] = 1;
    for (int i = 1; i < 22; i++) {
        powersOf2[i] = powersOf2[i - 1] * 2;
    }
}

int query(int x, int y) {
    while (x != 0 && y != 0) {
        int power = E[y];
        y -= powersOf2[power];
        x = stramosi[x][power];
    }
    return x;
}

int main()
{
    initE();
    initPowersOf2();

    fin >> n >> m;

    for (int i = 1; i <= n; i++) {
        fin >> stramosi[i][0];
        for (int stramos = 1; stramos <= 21; stramos++) {
            int order = stramosi[stramosi[i][stramos - 1]][stramos - 1];
            if (order == 0)
                break;
            stramosi[i][stramos] = order;
        }
    }

    for (int i = 1; i <= m; i++) {
        int x, y;
        fin >> x >> y;
        fout << query(x, y) << "\n";
    }
}