Advertisement
mikhubble

Untitled

Mar 22nd, 2018
93
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.63 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3.  
  4. using namespace std;
  5.  
  6. int fl(int len) {
  7.     if (len == 1)
  8.         return 0;
  9.     else
  10.         return fl(len / 2) + 1;
  11. }
  12.  
  13. int main() {
  14.     ios_base::sync_with_stdio(false);
  15.     cin.tie(nullptr);
  16.     freopen("sparse.in", "r", stdin);
  17.     freopen("sparse.out", "w", stdout);
  18.     int n, m, a1, ul, vl;
  19.     cin >> n;
  20.     vector<int> a(n + 1);
  21.     cin >> m >> a[0] >> ul >> vl;
  22.  
  23.  
  24.     int pow = 0;
  25.     int tmp = 1;
  26.     while (tmp < n) {
  27.         tmp <<= 1;
  28.         pow++;
  29.     }
  30.  
  31.     vector<vector<int>> d(n);
  32.     d[0].push_back(a[0]);
  33.     for (auto i = 1; i < n; i++) {
  34.         a[i] = (23 * a[i - 1] + 21563) % 16714589;
  35.         d[i].push_back(a[i]);
  36.     }
  37.     for (auto j = 1; j <= pow; j++) {
  38.         for (auto i = 0; i < n; i++) {
  39.             d[i].push_back(min(d[i][j - 1], d[i + (1 << (j - 1))][j - 1]));
  40.         }
  41.     }
  42.  
  43.     vector<int> pre(n + 1);
  44.     for (auto i = 1; i <= n; i++) {
  45.         pre[i] = fl(i);
  46.     }
  47.  
  48.     int r = max(ul, vl) + 1, l = min(ul, vl) - 1;
  49.     int len = r - l - 1;
  50.     int anslast = min(d[l][pre[len]], d[r - (1 << pre[len]) + 1][pre[len]]);
  51.  
  52.     for (auto i = 1; i < m; i++) {
  53.         ul = ((17 * ul + 751 + anslast + 2 * i) % n) + 1;
  54.         vl = ((13 * vl + 593 + anslast + 5 * i) % n) + 1;
  55.         if (ul == vl) {
  56.             anslast = a[i];
  57.             continue;
  58.         }
  59.         r = (max(ul, vl) + 1), l = min(ul, vl) - 1;
  60.         len = r - l - 1;
  61.         int x = r - (1 << pre[len]) + 1;
  62.         anslast = min(d[l][pre[len]], d[r - (1 << pre[len]) + 1][pre[len]]);
  63.     }
  64.     cout << ul << " " << vl << " " << anslast;
  65.     return 0;
  66. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement