#include<bits/stdc++.h>
using namespace std;
const int maxn=100050;
struct node{
int l,r;
int sum;
int lazy;
}tree[maxn<<2];
void push_up(int now)
{//视题目而定
tree[now].sum=tree[now<<1].sum+tree[now<<1|1].sum;
}
void push_down(int now,int range)
{
//视题目而定
if(tree[now].lazy)
{
tree[now<<1].lazy+=tree[now].lazy;
tree[now<<1|1].lazy+=tree[now].lazy;
tree[now<<1].sum+=tree[now].lazy*(range-range>>1);
tree[now<<1|1].sum+=tree[now].lazy*(range>>1);
tree[now].lazy=0;
}
}
void update(int l,int r,int val,int now)
{
if(tree[now].l==l&&tree[now].r==r)
{//视题目而定
tree[now].sum+=val*(r-l+1);
tree[now].lazy+=val;
return ;
}
push_down(now,(tree[now].r-tree[now].l+1));
int mid=(tree[now].l+tree[now].r)>>1;
if(r<=mid)update(l,r,val,now<<1);
else if(l>mid)update(l,r,val,now<<1|1);
else
{
update(l,mid,val,now<<1);
update(mid+1,r,val,now<<1|1);
}
push_up(now);
}
void build(int l,int r,int now)
{
tree[now].l=l;
tree[now].r=r;
tree[now].lazy=0;
if(l==r)
{ //视题目而定
scanf("%d",&tree[now].sum);
return;
}
int mid=(l+r)>>1;
build(l,mid,now<<1);
build(mid+1,r,now<<1|1);
push_up(now);
}
int query(int l,int r,int now)
{
if(tree[now].l==l&&tree[now].r==r)
return tree[now].sum;
push_down(now,(tree[now].r-tree[now].l+1));
int mid=(tree[now].l+tree[now].r)>>1;
int ans=0;
if(r<=mid)ans+=query(l,r,now<<1);
else if(l>mid)ans+=query(l,r,now<<1|1);
else
{ //视题目而定
ans+=query(l,mid,now<<1);
ans+=query(mid+1,r,now<<1|1);
}
return ans;
}
线段树
最新推荐文章于 2024-04-18 08:24:29 发布