Advertisement
kdzhr

Sparse Optimized

Mar 31st, 2020
128
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.77 KB | None | 0 0
  1. // OK E https://codeforces.com/gym/100093/attachments
  2. # include <iostream>
  3. # include <vector>
  4. # include <fstream>
  5.  
  6. int main() {
  7.     uint32_t n, m, a;
  8.     std::ifstream in;
  9.     in.open("sparse.in");
  10.     std::ofstream out;
  11.     out.open("sparse.out");
  12.     in >> n >> m >> a;
  13.     std::vector<uint32_t> vec(n);
  14.     std::vector<uint32_t> p(n + 1, 0); // логарифм с округлением вниз
  15.     uint32_t u1, u2;
  16.     in >> u1 >> u2;
  17.     u1--;
  18.     u2--;
  19.     vec[0] = a;
  20.     for (uint32_t i = 1; i < n; i++) {
  21.         vec[i] = (23 * vec[i - 1] + 21563) % 16'714'589;
  22.     }
  23.  
  24.     for (uint32_t base = 1, j = 0; base <= n; base *= 2, j++) {
  25.         p[base] = j;
  26.     }
  27.  
  28.     p[1] = 0;
  29.     for (uint32_t i = 2; i <= n; i++) {
  30.         p[i] = p[i / 2] + 1;
  31.     }
  32.  
  33.  
  34.     std::vector<std::vector<uint32_t>> min_value(n, std::vector<uint32_t>(p[n] + 1, UINT32_MAX));
  35.  
  36.     for (uint32_t i = 0; i < n; i++) {
  37.         min_value[i][0] = vec[i];
  38.     }
  39.     for (uint32_t j = 1; j <= p[n]; j++) {
  40.         for (uint32_t i = 0; i + (1u << j) <= n; i++) {
  41.             min_value[i][j] = std::min(min_value[i][j - 1], min_value[i + (1u << (j - 1))][j - 1]);
  42.         }
  43.     }
  44.     uint32_t j = p[std::max(u1, u2) - std::min(u1, u2) + 1];
  45.     uint32_t ans = std::min(min_value[std::min(u1, u2)][j], min_value[std::max(u1, u2) - ((1u << j) - 1)][j]);
  46.     for (uint32_t i = 2; i <= m; i++) {
  47.         u1 = ((17 * (u1 + 1) + 751 + ans + 2 * (i - 1)) % n);
  48.         u2 = ((13 * (u2 + 1) + 593 + ans + 5 * (i - 1)) % n);
  49.         j = p[std::max(u1, u2) - std::min(u1, u2) + 1];
  50.         ans = std::min(min_value[std::min(u1, u2)][j], min_value[std::max(u1, u2) - ((1u << j) - 1)][j]);
  51.     }
  52.     out << u1 + 1 << ' ' << u2 + 1 << ' ' << ans;
  53.     in.close();
  54.     out.close();
  55.     return 0;
  56. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement