AND vs OR

아직 제출이 없습니다시간 제한2초메모리 제한1024 MB

문제

수열 a_l,a_l+1,,a_ra\_l,a\_{l+1},\cdots,a\_r의 가치는 다음과 같이 정의된다.

  • 길이가 22 이하일 경우 수열의 가치는 00이다.
  • 길이가 33 이상일 경우 수열의 가치는 (a_l,&,a_r)(a_l+1,,a_l+2,,a_r1)(a\_l \\, \And \\,a\_r) - (a\_{l+1} \\, | \\, a\_{l+2} \\, | \cdots | \\, a\_{r-1})로 정의된다.

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

정수로 이루어진 수열 a_1,a_2,,a_Na\_1,a\_2,\cdots,a\_N이 주어진다.

다음과 같은 쿼리를 QQ번 수행하는 프로그램을 작성해보자.

  • ii jj :: a_i,a_i+1,,a_ja\_i,a\_{i+1},\cdots,a\_j이란 수열의 모든 연속된 부분 수열의 가치 중에서 양수인 것들의 합을 구해서 출력한다. (1ijN)(1\leq i \leq j \leq N)

입력

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

둘째 줄에 정수로 이루어진 수열 a_1,a_2,,a_Na\_1,a\_2,\cdots,a\_N이 공백으로 구분되어 주어진다. (0a_i1018)(0\leq a\_i \leq 10^{18})

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

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

출력

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

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