在人类智慧的山巅,有着一台字长为 位的超级计算机,著名理论计算机科学家 P 博士正用它进行各种研究。 不幸的是,这天台风切断了电力系统,超级计算机无法工作,而 P 博士明天就要交实验结果了,只好求助于学过 OI 的你……
P 博士将他的计算任务抽象为对一个整数的操作。
具体来说,有一个整数 ,一开始为 。
接下来有 个操作,每个操作都是以下两种类型中的一种:
- :将 加上整数 ,其中 为一个整数, 为一个非负整数
- :询问 在用二进制表示时,位权为 的位的值(即这一位上的 代表 )
保证在任何时候, 。
Constraints
$ n\leq 1000000$ , ,
Solution
数据范围提示得很明显……需要压位,每一个数字储存 位。
首先开两个数组,一个储存加法,一个储存减法,修改的时候在两个数组上暴力加法暴力进位即可。
现在考虑处理询问。因为保证在任何时刻, ,所以我们判断第 位时其实只与加法、减法第 到 位的数字的大小有关。根据减法的规则,稍微分一下类可得:若后面部分的数字差为负,则答案为相应位上的数字的同或,否则为异或。
判断第 到 位的加法数字和减法数字的大小,等价于判断字典序。找到第一个不相同的位置,判断大小即可。我们使用线段树来维护,利用线段树判断 到 的区间内最靠右的加法数组和减法数组不一样的位置。
时间复杂度 。
Code
1 |
|