의 모든 1인 비트가 어떤 에도 모두 포함되는지를 빠르게 판정할 수 있으면 된다.
크기 의 불 배열 을 만든다. 처음에는 등장한 값에 대해 로 둔다. 그 다음 각 비트 에 대해, 번 비트가 0인 모든 마스크 에 다음 전이를 적용한다.
이 SOS DP가 끝나면 는 어떤 가 의 모든 1인 비트를 포함할 때, 즉 인 가 존재할 때 정확히 참이다.
이제 쿼리 를 처리한다. 답을 으로 시작하고 비트 부터 까지 내려간다. 현재 비트가 에서 1이고 가 참이라면 그 비트를 에 추가한다. 높은 비트부터 가능한 한 1로 만들었으므로 마지막 가 최댓값이다.
한 테스트 케이스의 전처리는 , 모든 쿼리는 에 처리된다. 메모리 사용량은 이다.
증명
SOS DP 이후 가 참이라는 것은 정확히 의 모든 1인 비트를 포함하는 가 하나 이상 존재한다는 뜻이다. 따라서 쿼리 처리 중 가 참이면, 지금까지 선택한 모든 비트와 번 비트를 동시에 포함하는 하나의 가 존재한다.
Solution written by GPT5.6
비트를 높은 곳부터 본다고 하자. 현재 비트 를 1로 만들 수 있다면, 그 비트를 0으로 둔 어떤 결과보다 값이 크다. 더 낮은 모든 비트의 합은 이하이기 때문이다. 그러므로 가능한 경우에는 반드시 번 비트를 1로 선택하는 것이 최적이다.
이 선택을 각 비트에 반복하면, 매 단계에서 지금까지 정한 더 높은 비트들을 유지하면서 만들 수 있는 최댓값의 접두부를 얻는다. 마지막에는 어떤 와의 AND로 실제 달성 가능한 값 중 가장 큰 값이 남으므로 알고리즘은 정답을 출력한다.