线段树(main函数自由)

都是一些裸线段树的模板,无主函数!

#include<cstdio>
#include<algorithm>
#include<cstring>
#include<iostream>
#define ll long long
#define M 400010
#define lson l,m,now*2
#define rson m+1,r,now*2+1
using namespace std;
ll tag[M],sum[M];
void push_up(int now)
{
    sum[now]=sum[now*2]+sum[now*2+1];
}
void push_down(int now,int m)
{
    if(tag[now])
    {
        tag[now*2]+=tag[now];
        tag[now*2+1]+=tag[now];
        sum[now*2]+=tag[now]*(m-(m/2));
        sum[now*2+1]+=tag[now]*(m/2);
        tag[now]=0;
    }
}
void build(int l,int r,int now)
{
    tag[now]=0;
    if(l==r)
    {
        scanf("%lld",&sum[now]);
        return;
    }
    int m=(l+r)/2;
    build(lson);
    build(rson);
    push_up(now);
}
void modify(int pos,int v,int l,int r,int now)
{
    if(l==r)
    {
        sum[now]+=v;
        return;
    }
    int m=(l+r)/2;
    if(pos<=m)modify(pos,v,lson);
    else modify(pos,v,rson);
    push_up(now);
}
void change(int x,int y,int v,int l,int r,int now)
{
    if(l>=x&&r<=y)
    {
        tag[now]+=v;
        sum[now]+=(ll)v*(r-l+1);
        return;
    }
    push_down(now,r-l+1);
    int m=(l+r)/2;
    if(x<=m)change(x,y,v,lson);
    if(y>m)change(x,y,v,rson);
    push_up(now);
}
ll query(int x,int y,int l,int r,int now)
{
    if(l>=x&&r<=y)return sum[now];
    push_down(now,r-l+1);
    int m=(l+r)/2;
    ll ans=0;
    if(x<=m)ans+=query(x,y,lson);
    if(y>m)ans+=query(x,y,rson);
    return ans;
}
ll search(int v,int l,int r,int now)
{
    if(l==r) return sum[now];
    push_down(now,r-l+1);
    int m=(r+l)/2;
    if(v<=m) search(v,lson);
    else if(v>m) search(v,rson);
}
原文地址:https://www.cnblogs.com/harden/p/5579484.html