Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <vector>
- using namespace std;
- int fl(int len) {
- if (len == 1)
- return 0;
- else
- return fl(len / 2) + 1;
- }
- int main() {
- ios_base::sync_with_stdio(false);
- cin.tie(nullptr);
- freopen("sparse.in", "r", stdin);
- freopen("sparse.out", "w", stdout);
- int n, m, a1, ul, vl;
- cin >> n;
- vector<int> a(n + 1);
- cin >> m >> a[0] >> ul >> vl;
- int pow = 0;
- int tmp = 1;
- while (tmp < n) {
- tmp <<= 1;
- pow++;
- }
- vector<vector<int>> d(n);
- d[0].push_back(a[0]);
- for (auto i = 1; i < n; i++) {
- a[i] = (23 * a[i - 1] + 21563) % 16714589;
- d[i].push_back(a[i]);
- }
- for (auto j = 1; j <= pow; j++) {
- for (auto i = 0; i < n; i++) {
- d[i].push_back(min(d[i][j - 1], d[i + (1 << (j - 1))][j - 1]));
- }
- }
- vector<int> pre(n + 1);
- for (auto i = 1; i <= n; i++) {
- pre[i] = fl(i);
- }
- int r = max(ul, vl) + 1, l = min(ul, vl) - 1;
- int len = r - l - 1;
- int anslast = min(d[l][pre[len]], d[r - (1 << pre[len]) + 1][pre[len]]);
- for (auto i = 1; i < m; i++) {
- ul = ((17 * ul + 751 + anslast + 2 * i) % n) + 1;
- vl = ((13 * vl + 593 + anslast + 5 * i) % n) + 1;
- if (ul == vl) {
- anslast = a[i];
- continue;
- }
- r = (max(ul, vl) + 1), l = min(ul, vl) - 1;
- len = r - l - 1;
- int x = r - (1 << pre[len]) + 1;
- anslast = min(d[l][pre[len]], d[r - (1 << pre[len]) + 1][pre[len]]);
- }
- cout << ul << " " << vl << " " << anslast;
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement