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
|
class Solution {
public List<Long> handleQuery(int[] nums1, int[] nums2, int[][] queries) {
int n = nums1.length;
List<Long> ans = new ArrayList<>();
long[] seg = new long[4 * n], lazy = new long[4 * n];
build(nums1, seg, 1, 0, n-1);
long sum2 = 0;
for (int x : nums2) sum2 += x;
for (int[] q : queries) {
if (q[0] == 1) flip(seg, lazy, 1, 0, n-1, q[1], q[2]);
else if (q[0] == 2) {
long cnt = query(seg, lazy, 1, 0, n-1, 0, n-1);
sum2 += cnt * q[1];
} else ans.add(sum2);
}
return ans;
}
void build(int[] a, long[] seg, int node, int l, int r) {
if (l == r) seg[node] = a[l];
else {
int m = (l + r) / 2;
build(a, seg, 2*node, l, m);
build(a, seg, 2*node+1, m+1, r);
seg[node] = seg[2*node] + seg[2*node+1];
}
}
void flip(long[] seg, long[] lazy, int node, int l, int r, int ql, int qr) {
if (lazy[node] != 0) {
seg[node] = (r-l+1) - seg[node];
if (l != r) {
lazy[2*node] ^= 1;
lazy[2*node+1] ^= 1;
}
lazy[node] = 0;
}
if (qr < l || r < ql) return;
if (ql <= l && r <= qr) {
seg[node] = (r-l+1) - seg[node];
if (l != r) {
lazy[2*node] ^= 1;
lazy[2*node+1] ^= 1;
}
return;
}
int m = (l + r) / 2;
flip(seg, lazy, 2*node, l, m, ql, qr);
flip(seg, lazy, 2*node+1, m+1, r, ql, qr);
seg[node] = seg[2*node] + seg[2*node+1];
}
long query(long[] seg, long[] lazy, int node, int l, int r, int ql, int qr) {
if (lazy[node] != 0) {
seg[node] = (r-l+1) - seg[node];
if (l != r) {
lazy[2*node] ^= 1;
lazy[2*node+1] ^= 1;
}
lazy[node] = 0;
}
if (qr < l || r < ql) return 0;
if (ql <= l && r <= qr) return seg[node];
int m = (l + r) / 2;
return query(seg, lazy, 2*node, l, m, ql, qr) + query(seg, lazy, 2*node+1, m+1, r, ql, qr);
}
}
|