题目 代码
struct Segment_Tree
{
using ll=long long;
struct node
{
std::unique_ptr<node>ls,rs;//指针 左右儿子
int l1,r1;
ll sum,plus_lz;
node():ls(nullptr),rs(nullptr),l1(0),r1(0),sum(0),plus_lz(0){}//初始化
void push_up()
{
sum=0;
if(ls!=nullptr)
{
sum+=ls->sum;
}
if(rs!=nullptr)
{
sum+=rs->sum;
}
}
void reset(int l_,int r_,const ll v[])
{
l1=l_;
r1=r_;
if(l1==r1)
{
sum=v[r1];
return;
}
int mid=(l1+r1)>>1;
ls=std::unique_ptr<node>(new node);
ls->reset(l1,mid,v);
rs=std::unique_ptr<node>(new node);
rs->reset(mid+1,r1,v);
push_up();
}
void push_down()
{
if(ls!=nullptr)
{
ls->sum+=plus_lz*(ls->r1-ls->l1+1);
ls->plus_lz+=plus_lz;
}
if(rs!=nullptr)
{
rs->sum+=plus_lz*(rs->r1-rs->l1+1);
rs->plus_lz+=plus_lz;
}
plus_lz=0;
}
void modify(int l2,int r2,ll v)
{
if(l2>r1||r2<l1)return;
if(l2<=l1&&r1<=r2)
{
sum+=v;
plus_lz+=v;
return;
}
push_down();
if(ls!=nullptr)ls->modify(l2,r2,v);
if(rs!=nullptr)rs->modify(l2,r2,v);
push_up();
}
ll query(int l2,int r2)
{
if(l2>r1||r2<l1)return 0;
if(l2<=l1&&r1<=r2)return sum;
ll ans=0;
push_down();
if(ls!=nullptr)ans+=ls->query(l2,r2);
if(rs!=nullptr)ans+=rs->query(l2,r2);
push_up();
return ans;
}
}root;
void reset(int l_,int r_,const ll v[])
{
if(l_>r_)std::swap(l_,r_);
root.reset(l_,r_,v);
}
void modify(int l2,int r2,ll v)
{
if(l2>r2)std::swap(l2,r2);
root.modify(l2,r2,v);
}
ll query(int l2,int r2)
{
if(l2>r2)std::swap(l2,r2);
return root.query(l2,r2);
}//接口
}t;