Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- #define int int64_t
- using namespace std;
- int n = 100000;
- vector<int> a;
- vector<int> t_min, t_max;
- void build(int v = 1, int tl = 0, int tr = n - 1) {
- if (tl == tr) {
- t_min[v] = t_max[v] = a[tl];
- return;
- }
- int tm = (tl + tr) / 2;
- build(v * 2, tl, tm);
- build(v * 2 + 1, tm + 1, tr);
- t_min[v] = min(t_min[v * 2], t_min[v * 2 + 1]);
- t_max[v] = max(t_max[v * 2], t_max[v * 2 + 1]);
- }
- void update(int i, int x, int v = 1, int tl = 0, int tr = n - 1) {
- if (tl == tr) {
- a[tl] = x;
- t_min[v] = t_max[v] = a[tl];
- return;
- }
- int tm = (tl + tr) / 2;
- if (i <= tm) {
- update(i, x, v * 2, tl, tm);
- } else {
- update(i, x, v * 2 + 1, tm + 1, tr);
- }
- t_min[v] = min(t_min[v * 2], t_min[v * 2 + 1]);
- t_max[v] = max(t_max[v * 2], t_max[v * 2 + 1]);
- }
- pair<int, int> get(int l, int r, int v = 1, int tl = 0, int tr = n - 1) {
- if (l > r) {
- return {numeric_limits<int>::max(), numeric_limits<int>::min()};
- }
- if (l == tl && r == tr) {
- return {t_min[v], t_max[v]};
- }
- int tm = (tl + tr) / 2;
- pair<int, int> ans_l = get(l, min(r, tm), v * 2, tl, tm);
- pair<int, int> ans_r = get(max(l, tm + 1), r, v * 2 + 1, tm + 1, tr);
- return {min(ans_l.first, ans_r.first), max(ans_l.second, ans_r.second)};
- }
- int32_t main() {
- ios::sync_with_stdio(false);
- cin.tie(nullptr);
- a.resize(n);
- t_min.resize(4 * n);
- t_max.resize(4 * n);
- for (int i = 1; i <= n; i++) {
- a[i - 1] = i * i % 12345 + i * i * i % 23456;
- }
- build();
- int q;
- cin >> q;
- while (q--) {
- int i;
- cin >> i;
- if (i < 0) {
- int x;
- cin >> x;
- i = abs(i) - 1;
- update(i, x);
- } else {
- int l = i, r;
- cin >> r;
- l--, r--;
- pair<int, int> ans = get(l, r);
- cout << ans.second - ans.first << '\n';
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment