Advertisement
kdzhr

Sparse_TL

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