分块
// 根据下标 得到相应块...我感觉..这个就是核心了= =. // vlen = sqrt(1.0 * n); inline int getid(int index) { return (index - 1) / vlen + 1; } void add() { // Todo : 添加一个元素 同时维护块信息 } void sub(int index) { // Todo : 删除一个元素 同时维护块信息 } void chage(int index) { // Todo : 改变一个元素 同时维护块信息 // 找到块 int block_id = getid(index); // 修改块信息 如果对块内元素有影响 也要修改块内元素 } int query(int l, int r, int dth, int p) { int res = 0; int i, lid, rid; lid = getid(l); rid = getid(r); if (lid != rid) { // 分区间讨论 左右端点不在同一区间 左右端点在同一区间 for (i=l; i<=getid(l)*vlen; ++i) // 单个元素 ; for (i=lid+1; i<=rid-1; ++i) // 整块维护的信息 ; for (i=(getid(r)-1)*vlen+1; i<=r; ++i) // 单个元素 ; } else { for (i=l; i<=r; ++i) // 单个元素 ; } return res; }