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
| class Solution { boolean[] todo; int[] cnt1; public long[] handleQuery(int[] nums1, int[] nums2, int[][] queries) { int n = nums1.length; todo = new boolean[n * 4]; cnt1 = new int[n * 4]; build(1, 1, n, nums1); var sum = 0L; for (var x : nums2) sum += x; List<Long> ans = new ArrayList<>(); for(int[] query: queries){ if(query[0] == 1){ update(1, 1, n, query[1] + 1, query[2] + 1); }else if(query[0] == 2){ sum += (long) cnt1[1] * query[1]; }else{ ans.add(sum); } } long[] ans2 = new long[ans.size()]; for(int i = 0; i < ans2.length; ++i){ ans2[i] = ans.get(i); } return ans2; } public void build(int idx, int l, int r, int[] nums1){ if(l == r){ cnt1[idx] = nums1[l - 1]; return; } int m = (l + r) / 2; build(idx * 2, l, m, nums1); build(idx * 2 + 1, m + 1, r, nums1); cnt1[idx] = cnt1[idx * 2] + cnt1[idx * 2 + 1]; }
public void mydo(int idx, int l, int r){ cnt1[idx] = r - l + 1 - cnt1[idx]; todo[idx] = !todo[idx]; }
public void update(int idx, int l, int r, int L, int R){ if(l >= L && r <= R){ mydo(idx, l, r); return; } int m = (l + r) / 2; if(todo[idx]){ mydo(idx * 2, l, m); mydo(idx * 2 + 1, m + 1, r); todo[idx] = false; } if(m >= L){ update(idx * 2, l, m, L, R); } if(m < R){ update(idx * 2 + 1, m + 1, r, L, R); } cnt1[idx] = cnt1[idx * 2] + cnt1[idx * 2 + 1]; } }
|