Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #define _CRT_SECURE_NO_WARNINGS
- #include <iostream>
- #include <vector>
- #include <algorithm>
- using namespace std;
- const long long int n = 131072;
- vector<long long int> tree_min(2 * n);
- vector<long long int> tree_max(2 * n);
- const long long int MAX_INT = 1000000000;
- const long long int MIN_INT = -1000000000;
- long long int get_min(int v, int vl, int vr, int l, int r) {
- if (l > r) return MAX_INT;
- if (l == vl and r == vr) return tree_min[v];
- int vm = (vr + vl) / 2;
- return min(get_min(v * 2, vl, vm, l, min(vm, r)), get_min(v * 2 + 1, vm + 1, vr, max(l, vm + 1), r));
- }
- long long int get_max(int v, int vl, int vr, int l, int r) {
- if (l > r) return MIN_INT;
- if (l == vl and r == vr) return tree_max[v];
- int vm = (vr + vl) / 2;
- return max(get_max(v * 2, vl, vm, l, min(vm, r)), get_max(v * 2 + 1, vm + 1, vr, max(l, vm + 1), r));
- }
- void update(int ind, int val) {
- tree_min[ind + n] = val;
- tree_max[ind + n] = val;
- ind += n;
- ind /= 2;
- while (ind >= 1) {
- tree_min[ind] = min(tree_min[2 * ind], tree_min[2 * ind + 1]);
- tree_max[ind] = max(tree_max[2 * ind], tree_max[2 * ind + 1]);
- ind /= 2;
- }
- }
- int main() {
- freopen("rvq.in", "r", stdin);
- freopen("rvq.out", "w", stdout);
- for (int i = 0; i < n; i++) {
- tree_min[i + n] = (i * i) % 12345 + (i * i * i) % 23456;
- tree_max[i + n] = tree_min[i + n];
- }
- for (int i = n - 1; i >= 1; i--) {
- tree_min[i] = min(tree_min[2 * i], tree_min[2 * i + 1]);
- tree_max[i] = max(tree_max[2 * i], tree_max[2 * i + 1]);
- }
- int k, t1, t2, ans1, ans2;
- cin >> k;
- for (int i = 0; i < k; i++) {
- cin >> t1 >> t2;
- if (t1 > 0) {
- ans1 = get_max(1, 0, n - 1, t1, t2);
- ans2 = get_min(1, 0, n - 1, t1, t2);
- cout << ans1 - ans2 << "\n";
- }
- else {
- update(-t1, t2);
- }
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement