-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathbsfast.cpp
80 lines (75 loc) · 2.25 KB
/
bsfast.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
//
// Created by Aaron Zhu on 2021-07-01.
//
#include <iostream>
#include <vector>
#include <set>
#include <cmath>
#include <algorithm>
#include <functional>
#include <queue>
#define ll long long
#define pii pair<int, int>
#define boost() cin.tie(0); cin.sync_with_stdio(0)
#define scan(x) do{while((x=getchar())<'0'); for(x-='0'; '0'<=(_=getchar()); x=(x<<3)+(x<<1)+_-'0');}while(0)
char _;
using namespace std;
#define MAX 1000001
int n, q;
int instruction, ind, v, l, r, k;
int lastAns = 0;
int arr[MAX];
int seg[MAX * 4];
int fill(int node, int left, int right) {
if (left == right) return seg[node] = arr[left];
int mid = (left + right) / 2;
return seg[node] = min(fill(node * 2, left, mid), fill(node * 2 + 1, mid + 1, right));
}
int update(int node, int left, int right, int index) {
if (left == right) return seg[node] = arr[index];
int mid = (left + right) / 2;
if (index <= mid) update(node * 2, left, mid, index);
else update(node * 2 + 1, mid + 1, right, index);
return seg[node] = min(seg[node * 2], seg[node * 2 + 1]);
}
int query(int node, int one, int two, int left, int right, int val) {
if (right < one || left > two) return -1;
if (left <= one && two <= right) {
if (seg[node] >= val) return -1;
while (one != two) {
int mid = one + (two - one) / 2;
if (seg[node * 2] < val) {
node = node * 2;
two = mid;
} else {
node = node * 2 + 1;
one = mid + 1;
}
}
return one;
}
int mid = one + (two - one) / 2;
int tmp = query(node * 2, one, mid, left, right, val);
if (tmp != -1) return tmp;
return query(node * 2 + 1, mid + 1, two, left, right, val);
}
int main()
{
boost();
cin >> n >> q;
for (int i = 1; i <= n; i += 1) cin >> arr[i];
fill(1, 0, n);
for (int i = 0; i < q; i += 1) {
cin >> instruction;
if (instruction == 1) {
cin >> ind >> v;
arr[ind ^ lastAns] = v ^ lastAns;
update(1, 0, n, ind ^ lastAns);
} else {
cin >> l >> r >> k;
lastAns = query(1, 0, n, l ^ lastAns, r ^ lastAns, k ^ lastAns);
cout << lastAns << "\n";
}
}
return 0;
}