#CF1535D. 淘汰赛

淘汰赛

淘汰赛

  • 时间限制:2 秒
  • 内存限制:256 MiB

题目描述

有 2k2^k 支队伍参加一场淘汰赛。第一轮中,第 11 支队伍与第 22 支队伍比赛,第 33 支队伍与第 44 支队伍比赛,依此类推。每场比赛都会淘汰一支队伍。此后,每一轮都让上一轮相邻两场比赛的胜者继续比赛,直到产生唯一的冠军。

下图展示了 k=3k=3 时各场比赛的顺序。

淘汰赛示意图

全部 2k−12^k-1 场比赛按照实际进行的先后顺序编号,并由一个长度为 2k−12^k-1 的字符串 ss 描述:

  • 若 si=0s_i=0,第 ii 场比赛中编号较小的队伍获胜;
  • 若 si=1s_i=1,第 ii 场比赛中编号较大的队伍获胜;
  • 若 si=?s_i=?,第 ii 场比赛的结果尚未确定,两支队伍都可能获胜。

令 f(s)f(s) 表示可能成为冠军的队伍数量。若存在一种把所有问号替换为 00 或 11 的方式,使某支队伍成为冠军,则这支队伍被计入 f(s)f(s)。

给定初始字符串 ss,你需要依次处理 qq 次修改。每次修改把 sps_p 改成字符 cc,并求出修改后的 f(s)f(s)。

输入格式

第一行包含一个整数 kk(1≤k≤181\le k\le18)。

第二行包含一个长度为 2k−12^k-1 的字符串 ss,其中每个字符都是 0、1 或 ?。

第三行包含一个整数 qq(1≤q≤2×1051\le q\le2\times10^5)。

接下来 qq 行,每行包含一个整数 pp 和一个字符 cc(1≤p≤2k−11\le p\le2^k-1,cc 为 0、1 或 ?),表示把 sps_p 修改为 cc。

输出格式

对于每次修改,输出一行一个整数,表示修改后的 f(s)f(s)。

样例输入 1

3
0110?11
6
5 1
6 ?
7 ?
1 ?
5 ?
1 1

样例输出 1

1
2
3
3
5
4

数据范围

对于所有测试数据,1≤k≤181\le k\le18,∣s∣=2k−1|s|=2^k-1,1≤q≤2×1051\le q\le2\times10^5,1≤p≤2k−11\le p\le2^k-1。

子任务编号 分值 特殊限制
1 20 k≤4k\le4 且 q≤20q\le20
2 40 q≤100q\le100
3 无特殊限制