아직 만들고 있는 페이지입니다.

이 페이지는 아직 만드는 중입니다. 보이는 내용은 바뀔 수 있습니다.

AND vs OR

시간 제한2초메모리 제한1024 MB

요약
각 질의 구간에 속한 모든 연속 부분 수열의 값 중 양수인 것만 골라 더한 결과를 10^9+7로 나눈 나머지로 구합니다.
난이도

어려움10점 중 8점

유형
비트 연산, 분할 정복, 누적 합
정답자
아직 제출이 없습니다

문제

수열 al,al+1,⋯ ,ara_l,a_{l+1},\cdots,a_r의 가치는 다음과 같이 정의된다.

  • 길이가 22 이하일 경우 수열의 가치는 00이다.
  • 길이가 33 이상일 경우 수열의 가치는 (al & ar)−(al+1 ∣ al+2 ∣⋯∣ ar−1)(a_l \, \And \, a_r) - (a_{l+1} \, | \, a_{l+2} \, | \cdots | \, a_{r-1})로 정의된다.

&\And 연산자는 bitwise and 연산자이고, ∣| 연산자는 bitwise or 연산자이다.

정수로 이루어진 수열 a1,a2,⋯ ,aNa_1,a_2,\cdots,a_N이 주어진다.

다음 쿼리를 QQ번 수행하는 프로그램을 작성하라.

  • ii jj : ai,ai+1,⋯ ,aja_i,a_{i+1},\cdots,a_j 수열의 모든 연속 부분 수열 중 가치가 양수인 것들의 합을 구해 출력한다. (1≤i≤j≤N)(1\leq i \leq j \leq N)

입력

첫째 줄에 정수 NN이 주어진다. (1≤N≤1 000 000)(1\leq N \leq 1\,000\,000)

둘째 줄에 정수로 이루어진 수열 a1,a2,⋯ ,aNa_1,a_2,\cdots,a_N이 공백으로 구분되어 주어진다. (0≤ai≤1018)(0\leq a_i \leq 10^{18})

셋째 줄에 쿼리의 개수를 나타내는 정수 QQ가 주어진다. (1≤Q≤1 000 000)(1\leq Q \leq 1\,000\,000)

넷째 줄부터 QQ개의 줄에 걸쳐 쿼리를 나타내는 두 정수 ii, jj가 공백으로 구분되어 주어진다. (1≤i≤j≤N)(1\leq i \leq j \leq N)

출력

매 쿼리마다 정답을 한 줄에 하나씩 출력한다.

단, 정답이 매우 커질 수 있으므로 109+710^9+7로 나눈 나머지를 출력한다.

예제1

  1. 예제 1

    입력
    4
    11 2 8 15
    3
    1 3
    1 2
    1 4
    
    예상 출력
    6
    0
    7