#include <iostream>
#include <algorithm>
#include <cstring>
const int maxn=50002*4;
using namespace std;
int tree[maxn];
int lazy[maxn];
void push_up(int root)
{
tree[root]=tree[root<<1]+tree[root<<1|1];
};
void build_tree(int root,int left,int right)//建树
{
if(left==right)
{
cin>>tree[root];
return;
}
int mid=(left+right)>>1;
build_tree(root*2,left,mid);
build_tree(root*2+1,mid+1,right);
push_up(root);
}
void push_down(int root,int left_num,int right_num)//lazy数组的传递关系是直接赋值传递
{
if(lazy[root])
{
lazy[root*2]=lazy[root];
lazy[root*2+1]=lazy[root];
tree[root*2]=lazy[root]*left_num;
tree[root*2+1]=lazy[root]*right_num;
lazy[root]=0;
}
}
void update(int root,int pos,int num,int left, int right)//点修改
{
if(left==right)
{
tree[root]+=num;//点+num
// tree[root]=num; 点赋值就是把+num改成=num
return;
}
int mid=(left+right)/2;
if(pos<=mid)
{
update(root*2,pos,num,left,mid);
}
else
{
update(root*2+1,pos,num,mid+1,right);
}
push_up(root);
}
void section_update(int root,int L,int R,int left,int right,int val)
{
if(L<=left&&right<=R)
{
lazy[root]=val;
tree[root]=val*(right-left+1);
return;
}
int mid=(left+right)/2;
push_down(root,mid-left+1,right-mid);
if(L<=mid)
{
section_update(root*2,L,R,left,mid,val);
}
if(mid<R)
{
section_update(root*2+1,L,R,mid+1,right,val);
}
push_up(root);
}
int query(int root,int L,int R,int left,int right)//区间询问求和
{
if(L<=left&&R>=right)
{
return tree[root];
}
int mid=(left+right)/2;
push_down(root,mid-left+1,right-mid);
int ans=0;
if(L<=mid) ans+=query(L,R,left,mid,root*2);
if(R>mid) ans+=query(L,R,mid+1,right,root*2+1);
return ans;
}
int get_sum(int root,int left,int right,int L,int R)//区间求max
{
int mid=(L+R)/2;
int res=0;
if(left==L&&right==R)
{
return tree[root];
}
if(left>mid)
{
res+=get_sum(root*2+1,left,right,mid+1,R);
}
else if(right<=mid)
{
res+=get_sum(root*2,left,right,L,mid);
}
else
{
res+=get_sum(root*2,left,mid,L,mid);
res+=get_sum(root*2+1,mid+1,right,mid+1,R);
}
return res;
}
08-13