零一奇迹
时间限制:C/C++/Rust/Pascal 1秒,其他语言2秒
空间限制:C/C++/Rust/Pascal 256 M,其他语言512 M
64bit IO Format: %lld

题目描述

小红拿到了一个长度为 的 01 串(仅由字符 '0' 和 '1' 组成的字符串)。
小红想知道,有多少子串满足,其所表示的二进制数,其对应的十进制数值在 之间(只统计不含前导零的子串)?

注 1 :两个子串哪怕长的一模一样,但只要取的位置不同,则定义为 2 个不同子串
注 2 :所谓子串(substring),指字符串删掉部分前缀和后缀(也可以不删)形成的字符串。

这个问题小红觉得可能太简单了,于是她决定强化该问题:
她可能会添加一些修改操作:每次选择一个位置进行翻转,即将 0 变成 1 或者 1 变成 0 。

她希望每次修改操作之后,你可以回答“有多少子串满足,其所表示的二进制数,其对应的十进制数值在 之间?”这个问题的答案。
注:每次操作之后,字符串就会发生改变(即影响以后的询问)

输入描述:

第一行三个正整数
第二行为一个长度为 的 01 串。
第三行为一个正整数 。代表修改的次数

接下来的 行,每行有一个正整数 ,代表翻转第 位置上的字符。



输出描述:

一共输出 行,每行一个整数,代表每次操作之后问题的答案。
请注意,每次操作后字符串的改动是会持续到未来的询问的。

示例1

输入

复制
5 2 4
10100
5
5
5
4
3
4

输出

复制
2
3
3
3
2

说明

翻转 5 号位置以后, 字符串为10101,可能的结果有 10101 , 10101
翻转 5 号位置以后, 字符串为10100,可能的结果有 10100 , 10100 , 10100
翻转 4 号位置以后, 字符串为10110,可能的结果有 10110 , 10110 , 10110
翻转 3 号位置以后, 字符串为10010,可能的结果有 10010 , 1001010010
翻转 4 号位置以后, 字符串为10000,可能的结果有 10000 , 10000