Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // OK E https://codeforces.com/gym/100093/attachments
- # include <iostream>
- # include <vector>
- # include <fstream>
- int main() {
- uint32_t n, m, a;
- std::ifstream in;
- in.open("sparse.in");
- std::ofstream out;
- out.open("sparse.out");
- in >> n >> m >> a;
- std::vector<uint32_t> vec(n);
- std::vector<uint32_t> p(n + 1, 0); // логарифм с округлением вниз
- uint32_t u1, u2;
- in >> u1 >> u2;
- u1--;
- u2--;
- vec[0] = a;
- for (uint32_t i = 1; i < n; i++) {
- vec[i] = (23 * vec[i - 1] + 21563) % 16'714'589;
- }
- for (uint32_t base = 1, j = 0; base <= n; base *= 2, j++) {
- p[base] = j;
- }
- p[1] = 0;
- for (uint32_t i = 2; i <= n; i++) {
- p[i] = p[i / 2] + 1;
- }
- std::vector<std::vector<uint32_t>> min_value(n, std::vector<uint32_t>(p[n] + 1, UINT32_MAX));
- for (uint32_t i = 0; i < n; i++) {
- min_value[i][0] = vec[i];
- }
- for (uint32_t j = 1; j <= p[n]; j++) {
- for (uint32_t i = 0; i + (1u << j) <= n; i++) {
- min_value[i][j] = std::min(min_value[i][j - 1], min_value[i + (1u << (j - 1))][j - 1]);
- }
- }
- uint32_t j = p[std::max(u1, u2) - std::min(u1, u2) + 1];
- uint32_t ans = std::min(min_value[std::min(u1, u2)][j], min_value[std::max(u1, u2) - ((1u << j) - 1)][j]);
- for (uint32_t i = 2; i <= m; i++) {
- u1 = ((17 * (u1 + 1) + 751 + ans + 2 * (i - 1)) % n);
- u2 = ((13 * (u2 + 1) + 593 + ans + 5 * (i - 1)) % n);
- j = p[std::max(u1, u2) - std::min(u1, u2) + 1];
- ans = std::min(min_value[std::min(u1, u2)][j], min_value[std::max(u1, u2) - ((1u << j) - 1)][j]);
- }
- out << u1 + 1 << ' ' << u2 + 1 << ' ' << ans;
- in.close();
- out.close();
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement