线段树板子(单点和区间的查询+修改)

#include<cstdio>
using namespace std;
int const maxn = 1e6;
int n, m;
long long sum[4 * maxn + 5], input[maxn+5], add[maxn * 4 + 5];
inline void build(int k, int l, int r)
{
    if(l==r)
    {
        sum[k] = input[l];
        return;
    }
    int mid = (l+r)>>1;
    build(k<<1,l,mid);
    build((k<<1)+1,mid+1,r);
    sum[k] = sum[k<<1] + sum[(k<<1)+1];
    return;
}
inline void dotchange(int k, int l, int r, int x, int v)
{
    if(l==r)
    {
        sum[k] += v;
        return;
    }
    int mid = (l+r) >> 1;
    if(x <= mid)
    {
        dotchange(k<<1,l,mid,x,v);    
    }
    else
    {
        dotchange((k<<1)+1,mid+1,r,x,v);    
    }
    sum[k] = sum[k<<1] + sum[(k<<1)+1];
}
inline int dotquery(int k, int l, int r, int x)
{
    if(l==x)
    {
        return sum[k];
    }
    int mid = (l+1) >> 1;
    if(x <= mid)
    {
        return dotquery(k<<1,l,mid,x);    
    }
    else
    {
        return dotquery((k<<1+1),mid+1,r,x);    
    }
}
void Add(int k, int l, int r, int v)
{
    add[k] += v;
    sum[k] += (r-l+1)*v;
    return;
}
void pushdown(int k, int l, int r,int mid)
{
    if(add[k] == 0) return;
    Add(k<<1,l,mid,add[k]);
    Add((k<<1)+1,mid+1,r,add[k]);
    add[k] = 0;    
}
void longchange(int k, int l, int r, int x, int y, int v)
{
    if(x<=l && r<=y)
    {
        Add(k,l,r,v);
        return;
    }
    int mid = (l+r)>>1;
    pushdown(k,l,r,mid);
    if(x<=mid)
    {
        longchange(k<<1,l,mid,x,y,v);    
    }
    if(y>=mid+1)
    {
        longchange((k<<1)+1,mid+1,r,x,y,v);    
    }
    sum[k] = sum[k<<1] + sum[(k<<1)+1];
}
long long longquery(int k, int l, int r, int x, int y)
{
    if(x<=l && r<=y)
    {
        return sum[k];    
    }
    int mid = (l+r) >> 1;
    pushdown(k,l,r,mid);
    long long res = 0;
    if(x<=mid)
    {
        res += longquery(k<<1,l,mid,x,y);    
    }
    if(y>=mid+1)
    {
        res += longquery((k<<1)+1,mid+1,r,x,y);    
    }
    sum[k] = sum[k<<1] + sum[(k<<1)+1];
    return res;
}
int main()
{
    scanf("%d%d", &n, &m);
    for(int i = 1;i <= n;i++)
    {
        scanf("%d", &input[i]);    
    }
    build(1,1,n);
    for(int q = 1;q <= m;q++)
    {
        int a, b, c, d;
        scanf("%d", &a);
        if(a == 1)
        {
            scanf("%d%d%d", &b,&c,&d);
            longchange(1,1,n,b,c,d);
        }
        else
        {
            scanf("%d%d", &b, &c);
            printf("%lld\n", longquery(1,1,n,b,c));    
        }
    }
    return 0;    
}

 

线段树板子(单点和区间的查询+修改)

上一篇:关于mui上拉加载遇到的一些问题


下一篇:bootstrap-table使用总结