分块

// 根据下标 得到相应块...我感觉..这个就是核心了= =. 
// 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;
} 
原文地址:https://www.cnblogs.com/cgjh/p/9349287.html