Cod sursa(job #3134063)

Utilizator vatau.lorenaVatau Lorena vatau.lorena Data 28 mai 2023 01:20:18
Problema Stramosi Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.03 kb
#include <stdio.h>
#include <fstream>
#include <vector>
#include <cmath>

#define fin "stramosi.in"
#define fout "stramosi.out"

const int Nmax = 250001;
const int logNmax = 20;

std::vector<std::vector<long>> a(logNmax, std::vector<long>(Nmax));
int N, M;

long ancestor(long x, long p) {
    for (int i = logNmax - 1; i >= 0; --i) {
        if (p >= (1 << i)) {
            x = a[i][x];
            p -= (1 << i);
        }
    }
    return x;
}

void solve() {
    std::ifstream fi(fin);
    std::ofstream fo(fout);

    fi >> N >> M;

    for (int i = 1; i <= N; ++i) {
        fi >> a[0][i];
    }

    int logN = std::ceil(std::log2(N));

    for (int k = 1; k <= logN; ++k) {
        for (int i = 1; i <= N; ++i) {
            a[k][i] = a[k - 1][a[k - 1][i]];
        }
    }

    for (int m = 0; m < M; ++m) {
        int i, j;
        fi >> i >> j;
        long k = ancestor(i, j);
        fo << k << "\n";
    }

    fi.close();
    fo.close();
}

int main() {
    solve();
    return 0;
}