3
private final int digits = 15;4
private int[][] presum;5
private ArrayList<Integer>[] pos;7
public MajorityChecker(int[] arr) {9
presum = new int[len + 1][digits];10
pos = new ArrayList[20001];12
for (int i = 0; i < len; i++) {14
if (pos[n] == null) pos[n] = new ArrayList();17
for (int j = 0; j < digits; j++) {18
presum[i + 1][j] = presum[i][j] + (n & 1);24
public int query(int left, int right, int threshold) {26
for (int i = digits - 1; i >= 0; i--) {27
int cnt = presum[right + 1][i] - presum[left][i];29
if (cnt >= threshold) b = 1;30
else if (right - left + 1 - cnt >= threshold) b = 0;36
ArrayList<Integer> list = pos[ans];37
if (list == null) return -1;38
int L = floor(list, left - 1);39
int R = floor(list, right);40
if (R - L >= threshold) return ans;44
private int floor(ArrayList<Integer> list, int n) {45
int left = 0, right = list.size() - 1, mid;46
while (left <= right) {47
mid = left + (right - left) / 2;48
int index = list.get(mid);49
if (index == n) return mid;50
else if (index < n) left = mid + 1;