线段树代码:
class Segment_Tree
{
private:
struct node
{
long long l, r;
long long s;
long long t;
}tree[MAXN<<2];
void push_up(long long n)
{
tree[n].s=tree[n<<1].s+tree[n<<1|1].s;
}
void push_down(long long n)
{
if(tree[n].t)
{
tree[n<<1].t+=tree[n].t;
tree[n<<1|1].t+=tree[n].t;
long long m=(tree[n].l+tree[n].r)>>1;
tree[n<<1].s+=(m-tree[n<<1].l+1)*tree[n].t;
tree[n<<1|1].s+=(tree[n<<1|1].r-m)*tree[n].t;
tree[n].t=0;
}
}
public:
void buildtree(long long n, long long l, long long r, long long input[])
{
tree[n].l=l, tree[n].r=r, tree[n].t=0;
if(l==r)
{
tree[n].s=input[l];
return;
}
int m=(l+r)>>1;
buildtree(n<<1, l, m, input);
buildtree(n<<1|1, m+1, r, input);
push_up(n);
}
void update_section(long long n, long long l, long long r, long long v)
{
if(tree[n].l>=l&&tree[n].r<=r)
{
tree[n].s+=(tree[n].r-tree[n].l+1)*v;
tree[n].t+=v;
return;
}
push_down(n);
if(tree[n<<1].r>=l)
update_section(n<<1, l, r, v);
if(tree[n<<1|1].l<=r)
update_section(n<<1|1, l, r, v);
push_up(n);
}
long long search_section(long long n, long long l, long long r)
{
if(tree[n].l>=l&&tree[n].r<=r)
return tree[n].s;
push_down(n);
long long c=0;
if(tree[n<<1].r>=l)
c+=search_section(n<<1, l, r);
if(tree[n<<1|1].l<=r)
c+=search_section(n<<1|1, l, r);
return c;
}
};