ACM模板——线段树&树状数组

const int maxn = 1 << 18;

int n, dat[2*maxn];

void init(int n_)
{
    n = (1 << 18)-2;
    memset(dat,0,sizeof(dat));
}

//更新第k(0-index)个值为a
void update(int k)
{
    k += n+1;
    dat[k] ++;
    while(k>0)
    {
        k = (k-1)/2;
        dat[k] = dat[k*2+1]+dat[k*2+2];
    }
}

//求(a,b)val
//query(a,b,0,0,n)
int query(int a,int b,int k,int l,int r)
{
    //不相交
    if(r<a || b<l) return 0;

    if(a<=l && r<=b) {return dat[k];}
    else
    {
        int vl = query(a,b,k*2+1,l,(l+r)/2);
        int vr = query(a,b,k*2+2,(l+r)/2+1,r);
        
        return vl+vr;
    }
    return -1;//error
}
线段树

猜你喜欢

转载自www.cnblogs.com/Asurudo/p/10658452.html