雨露均沾救助
查看原帖
雨露均沾救助
405894
233L楼主2022/1/27 13:02

提交记录

#include<bits/stdc++.h>
#define ls(id) (id<<1)
#define rs(id) ((id<<1)|1)
#define N 2000004
using namespace std;
int n,q;
struct node{
	int l,r,tag1,tag2;
	/*tag1 下限 
	0 null
	tag2 上限 
	1e9 null
	*/
	
}tree[N<<2];

inline void push_down(int id){
	if(!tree[id].tag1&&tree[id].tag2==1e9)return;
	if(tree[id].tag1){
		tree[ls(id)].tag1=max(tree[ls(id)].tag1,tree[id].tag1);
		tree[ls(id)].tag2=max(tree[ls(id)].tag2,tree[id].tag1);
//		if(tree[ls(id)].tag1>tree[ls(id)].tag2)
//			tree[ls(id)].tag2=tree[id].tag1;//不是清空 
		tree[rs(id)].tag1=max(tree[rs(id)].tag1,tree[id].tag1);
		tree[rs(id)].tag2=max(tree[rs(id)].tag2,tree[id].tag1);
//		if(tree[rs(id)].tag1>tree[rs(id)].tag2)
//			tree[rs(id)].tag2=tree[id].tag1;
	}
	else{
		tree[ls(id)].tag2=min(tree[ls(id)].tag2,tree[id].tag2);
		tree[ls(id)].tag1=min(tree[ls(id)].tag1,tree[id].tag2);
//		if(tree[ls(id)].tag2<tree[ls(id)].tag1)
//			tree[ls(id)].tag1=tree[id].tag2;
		tree[rs(id)].tag2=min(tree[rs(id)].tag2,tree[id].tag2);
		tree[rs(id)].tag1=min(tree[rs(id)].tag1,tree[id].tag2);
//		if(tree[rs(id)].tag2<tree[rs(id)].tag1)
//			tree[rs(id)].tag1=tree[id].tag2;
	}
	//是否需要清除标记?
	tree[id].tag1=0,tree[id].tag2=1e9;	 
}
void build(int id,int l,int r){
	tree[id].l=l,tree[id].r=r;
	tree[id].tag1=0,tree[id].tag2=1e9;
	if(l==r)return;
	int mid=l+r>>1;
	build(ls(id),l,mid);
	build(rs(id),mid+1,r);
}
void update(int id,int l,int r,int h,bool f){
	if(tree[id].l>r||tree[id].r<l)return;
	if(l<=tree[id].l&&tree[id].r<=r){
		if(!f){
			tree[id].tag1=max(tree[id].tag1,h);
			tree[id].tag2=max(tree[id].tag2,h);
//			if(tree[id].tag1>tree[id].tag2)
//				tree[id].tag2=tree[id].tag1;//同理 
		}
		else{
			tree[id].tag2=min(tree[id].tag2,h);
			tree[id].tag1=min(tree[id].tag1,h);
//			if(tree[id].tag2<tree[id].tag1)
//				tree[id].tag1=tree[id].tag2;
		}
		return;
	}
	push_down(id);
	update(ls(id),l,r,h,f);
	update(rs(id),l,r,h,f);
}
void print(int id){
	if(tree[id].l==tree[id].r){
		printf("%d\n",tree[id].tag1);
		return;
	}
	push_down(id);
	print(ls(id));
	print(rs(id));
}
int main(){
	scanf("%d%d",&n,&q);
	build(1,1,n);
	
	int op,l,r,h;
	while(q--){
		scanf("%d%d%d%d",&op,&l,&r,&h);
		l++,r++;
		if(op==1)
			update(1,l,r,h,0);
		else
			update(1,l,r,h,1);
	}
	print(1);
}
2022/1/27 13:02
加载中...