线段树+树状数组+分块+循环展开 的模板

#define lson l,m,rt<<1
#define rson m+1 r,rt<<1|1
void update(int rt){
    sum[rt]=sum[rt<<1]+sum[rt<<1|1];
} 
void build(int l,int r,int rt){
    if(l==r){
        sum[rt]=z[l];
        return ;
    }
    int m=(l+r)>>1;
    build(lson);
    build(rson);
    update(rt);
}
build(1,n,1);
int query(int l,int r,int rt,int nowl,int nowr){
    if(nowl<=l&&r<=nowr) return sum[rt];
    int m=(l+r)>>1;
    int ans=0;
    if(nowl<=m) ans+=query(lson,nowl,nowr);
    if(m<nowr) ans+=query(rson,nowl,nowr);
    return ans;
}
query(1,n,1,l,r);
void modify(int l,int r,int rt,int p,int v)
{
    if(l==r){
        sum[rt]=v;
        return;
    }
    int m=(l+r)>>1;
    if(p<=m) modify(lson,p,v);
    else modify(rson,p,v);
    update(rt);
}
modify(1,n,1,p,v);
/*线段树*/


#define lb(x) ((x)&(-x))
int modify(int p,int v){
    for(;p<=n;p+=lb(p)) z[p]+=v;
}
int query(int p)
{
    int ans=0;
    for(;p;p-=lb(p)) ans+=a[p];
    return ans;
}
/*树状数组*/
int s=(int)sqrt(n);
for (int a=1;a<=n;a++)
    belong[a]=(a-1)/s+1;
for (int a=1;a<=n;a++)
    right[belong[a]]=a;
for (int a=n;a>=1;a--)
    left[belong[a]]=a;
for (int a=1;a<=n;a++)
    sum[belong[a]]+=z[a];

int query(int l,int r) {
    int ans=0;
    if (belong[l]==belong[r]) {
        for (int a=l;a<=r;a++)
            ans+=z[a]+col[belong[a]];
    }
    else {
        for (int a=l;a<=right[belong[l]];a++)
            ans+=z[a]+col[belong[a]];
        for (int a=belong[l]+1;a<belong[r];a++)
            ans+=sum[a];
        for (int a=left[belong[r]];a<=r;a++)
            ans+=z[a]+col[belong[a]];
    }
    return ans;
}

void modify(int l,int r,int v) {
    if (belong[l]==belong[r]) {
        for (int a=l;a<=r;a++) {
            z[a]+=v;
            sum[belong[a]]+=v;
        }
    }
    else {
        for (int a=l;a<=right[belong[l]];a++) {
            z[a]+=v;
            sum[belong[a]]+=v;
        }
        for (int a=belong[l]+1;a<belong[r];a++) {
            col[a]+=v;
            sum[a]+=(right[a]-left[a]+1)*v;
        }
        for (int a=left[belong[r]];a<=r;a++) {
            z[a]+=v;
            sum[belong[a]]+=v;
        }
    }
}
int ans=0;
for (int a=1;a<=n;a++)
    ans += a;

for (int a=1;a<=n;a+=2) {
    ans += a;
    ans += a+1;
}
/*循环展开*/
原文地址:https://www.cnblogs.com/ZDHYXZ/p/7207126.html