区间赋值+区间最大值
永久化标记
struct tree
{
struct node
{
int l,r; // 左右边界
node *lson,*rson; // 左右儿子
int maxs; // 区间最大值
int set_tag; // 区间赋值标记
node();
node(int l,int r):l(l),r(r),lson(nullptr),rson(nullptr),maxs(0),set_tag(0){}
} *root;
#define init \
int &l=Node->l,&r=Node->r; \
node *&lson=Node->lson,*&rson=Node->rson; \
int &maxs=Node->maxs; \
int &set_tag=Node->set_tag;
void upd(node *Node) // 更新左右儿子
{
init;
int mid=l+r>>1;
if(lson==nullptr)
lson=new node(l,mid);
if(rson==nullptr)
rson=new node(mid+1,r);
}
void modify(node *Node,int x,int y,int v) // 区间赋值
{
init;
if(y<l||r<x)
return;
maxs=v;
if(x<=l&&r<=y)
{
set_tag=v;
return;
}
upd(Node);
modify(lson,x,y,v);
modify(rson,x,y,v);
}
int query(node *Node,int x,int y) // 区间查询
{
init;
if(y<l||r<x)
return 0;
int ans=set_tag;
if(x<=l&&r<=y)
return ans=max(ans,maxs);
upd(Node);
ans=max(ans,query(lson,x,y));
ans=max(ans,query(rson,x,y));
return ans;
}
tree(){}
tree(int l,int r):root(new node(l,r)){}
#undef init
};