Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <vector>
- #include <cmath>
- #include <set>
- #include <deque>
- #include <queue>
- #include <algorithm>
- #include <stack>
- #include <map>
- #include <string>
- #include <iomanip>
- #include <fstream>
- #define all(v) v.begin(), v.end()
- #define ll long long
- #define lb lower_bound
- #define ub upper_bound
- #define len(v) (int)v.size()
- using namespace std;
- const ll inf = 1e18;
- const ll MAXN = 1e5 + 10;
- const int logn = 20;
- template<class T>
- istream& operator>>(istream& in, vector<T>& a) {
- for (auto& i : a)
- in >> i;
- return in;
- }
- template<class T>
- ostream& operator<<(ostream& out, vector<T>& a) {
- for (auto& i : a)
- out << i << " ";
- return out;
- }
- ll n, m, a1, u, v;
- ll a[MAXN];
- vector<ll> log_2;
- ll dp[MAXN][logn];
- void initRMQ() {
- int i, j;
- for (i = 1; i <= n; i++) dp[i][0] = i;
- for (j = 1; (1 << j) <= n; j++) {
- for (i = 1; i + (1 << j) - 1 <= n; i++) {
- if (a[dp[i][j - 1]] < a[dp[i + (1 << (j - 1))][j - 1]])
- dp[i][j] = dp[i][j - 1];
- else dp[i][j] = dp[i + (1 << (j - 1))][j - 1];
- }
- }
- }
- ll get(ll l, ll r) {
- ll k = (ll)(log(1.0 * r - l + 1) / log(2.0));
- ll res = dp[l][k];
- if (a[dp[r - (1 << k) + 1][k]] < a[res])
- res = dp[r - (1 << k) + 1][k];
- return res;
- }
- void solve() {
- ifstream fin("sparse.in");
- ofstream fout("sparse.out");
- fin >> n >> m >> a1 >> u >> v;
- a[1] = a1;
- for (int i = 2; i <= n; i++) {
- a[i] = (23 * a[i - 1] + 21563) % 16714589;
- }
- initRMQ();
- ll ans;
- for (int i = 1; i <= m; ++i) {
- ll u_ = u;
- ll v_ = v;
- if (u_ > v_) swap(u_, v_);
- ans = a[get(u_, v_)];
- if (i == m) break;
- u = ((17 * u + 751 + ans + 2 * i) % n) + 1;
- v = ((13 * v + 593 + ans + 5 * i) % n) + 1;
- }
- fout << u << " " << v << " " << ans;
- }
- signed main() {
- ios::sync_with_stdio(false);
- cin.tie(nullptr);
- cout.tie(nullptr);
- solve();
- };
Advertisement
Add Comment
Please, Sign In to add comment