回到了正常的时空,神犇和 LCR 暂时过着安宁又平静的生活,他们回想起三年前的往事……
秋日的北校门格外美丽,这天,神犇和 LCR 第一次因化学中二而相遇……
令神犇难以忘怀的是,他与 LCR 相遇是在校门外的树下。那棵树的奇特形态深深印在神犇的脑中。神犇称这棵树是一棵“K 项树”。
为了纪念他和 LCR 的第一次相遇,神犇后来写的树状数组都是以 K 进制而非二进制为基的。
神犇的机房里有一位名叫 LCA 的蒟蒻,一天他碰巧欣赏到了神犇的代码,它发现神犇的树状数组是这么写的:
function add(x,v)
while x <= n do
s[x] = s[x] xor v
x = x + lowbitv(x)
end while
end function
function query(x)
ans = 0
while x > 0 do
ans = ans xor s[x]
x = x - lowbit(x)
end while
return ans
end function
其中:
- 表示 进制下 的最低非零位的值(例如当 时,)
- 表示 进制下 的最低非零位的位值(即该位为 1 其它位都为 0 时的数值,例如当 时,)
这份代码的作用是维护一个长度为 的序列 ,支持单点异或上一个值和求前缀异或和。 维护的是 。( 表示按位异或)
LCA 觉得这种写法十分不错,于是自己也这么写,但总是写挂的 LCA 漏打了一个字符,还把 的值设定得大了很多。
也就是说,LCA 的代码是这么写的:
function add(x,v)
while x <= n do
s[x] = s[x] xor v
x = x + lowbit(x) //注意,这里是 lowbit,这也是两份代码唯一的区别
end while
end function
function query(x)
ans = 0
while x > 0 do
ans = ans xor s[x]
x = x - lowbit(x)
end while
return ans
end function
注意:两个函数调用的都是 。
紧接着 LCA 就发现自己的代码跑得比谁都慢,他百思不得其解,只好来请你帮他解决这个问题。
请写一个和 LCA 的程序的输出相同的程序。
注意,你的任务是写一个和 LCA 的程序输出相同的程序,而不是正确的程序。