1or0
时间限制:C/C++/Rust/Pascal 1秒,其他语言2秒
空间限制:C/C++/Rust/Pascal 1024 M,其他语言2048 M
64bit IO Format: %lld

题目描述

\hspace{15pt}定义由 n 个字符组成的二进制字符串 s_1s_2\cdots s_n 的“自审值”为:s_1 \operatorname{or} s_2 \operatorname{or} \cdots \operatorname{or} s_n
\hspace{15pt}现在,对于给定的字符串,你需要独立处理 q 次询问。每一次询问给定一个区间 [l, r],求解区间内全部连续子串的“自审值”之和。

\hspace{15pt}其中,\operatorname{or} 表示按位或运算。如果您需要更多位运算相关的知识,可以参考 OI-Wiki的相关章节
\hspace{15pt}子串为从原字符串中,连续的选择一段字符(可以全选、可以不选)得到的新字符串。

输入描述:

\hspace{15pt}第一行输入一个整数 n \left(1 \leqq n \leqq 2 \times 10^5\right) 代表字符串的长度。
\hspace{15pt}第二行输入一个长度为 n、仅由 \texttt{`0'}\texttt{`1'} 两个字符组成的字符串 s,代表给定的字符串。下标从 1 开始。

\hspace{15pt}第三行输入一个整数 q \left(1 \leqq q \leqq 2 \times 10^5\right) 代表询问次数。
\hspace{15pt}此后 q 行,每行输入两个整数 l, r \left(1 \leqq l \leqq r \leqq n\right) 代表询问的区间。

输出描述:

\hspace{15pt}对于每一次询问,新起一行。输出一个整数,代表区间内全部连续子串的“自审值”之和。
示例1

输入

复制
5
10110
2
3 5
1 1

输出

复制
5
1

说明

\hspace{15pt}对于第一次询问,拆分出全部子区间:
\hspace{23pt}\bullet\,区间 [3, 3] 的“自审值”为 1
\hspace{23pt}\bullet\,区间 [3, 4] 的“自审值”为 1 \operatorname{or} 1 = 1
\hspace{23pt}\bullet\,区间 [3, 5] 的“自审值”为 1 \operatorname{or} 1 \operatorname{or} 0 = 1
\hspace{23pt}\bullet\,区间 [4, 4] 的“自审值”为 1
\hspace{23pt}\bullet\,区间 [4, 5] 的“自审值”为 1 \operatorname{or} 0 = 1
\hspace{23pt}\bullet\,区间 [5, 5] 的“自审值”为 0
\hspace{15pt}综上所述,“自审值”之和为 1 + 1 + 1 + 1 + 1 + 0 = 5