分块

根号平衡

O(1)\mathcal{O}(1) 单点修改,O(n)\mathcal{O}(\sqrt{n}) 区间求和:序列分块,块上记录块内和。
O(n)\mathcal{O}(\sqrt{n}) 单点修改,O(1)\mathcal{O}(1) 区间求和:序列分块,块上记录前面块的前缀和,点上记录块内的前缀和

O(n)\mathcal{O}(\sqrt{n}) 区间加,O(1)\mathcal{O}(1) 单点查询:序列分块,整块打懒标记。
O(1)\mathcal{O}(1) 区间加,O(n)\mathcal{O}(\sqrt{n}) 单点查询:序列分块,将区间加差分为两次区间修改,在块上和点上分别打上标记;查询时分块内块外查询后缀标记和。

给一个集合, O(1)\mathcal{O}(1) 加入一个数,O(n)\mathcal{O(\sqrt{n})} 查询第 kk 大:值域分块,块上记录块内数字的总出现次数。
给一个集合,O(n)\mathcal{O}(\sqrt{n}) 加入一个数,O(1)\mathcal{O}(1) 查询第 kk 大:值域分块,对于当前所有已经有的数分块,每次加入一个数至多改变 n\sqrt{n} 个数所属的块编号。

CodeChef-Chef and Churu:
  给长为 nn 的序列,给定 mm 个函数,每个函数为序列中第 lil_i 到第 rir_i 个数的和。两种操作:将 axa_x 改为 yy ;查询 [x,y][x,y] 之间的函数的和 (n,m105)(n,m\leq 10^5)