求调(哭)
查看原帖
求调(哭)
763878
Jerry_heng楼主2023/11/17 21:10
#include<bits/stdc++.h>
using namespace std;
int n,t;
struct node{
	int ans,lsum,rsum,laz,len;
}tree[200010];
void build(int o,int l,int r){
	tree[o].laz=0;
	tree[o].len=r-l+1;
	tree[o].lsum=tree[o].rsum=tree[o].ans=tree[o].len;
	if(l==r)return;
	int mid=(l+r)>>1;
	build(o*2,l,mid);
	build(o*2+1,mid+1,r);
}
void pushdown(int o){
	if(tree[o].laz==0)return;
	if(tree[o].laz==1){
		tree[o*2].laz=tree[o*2+1].laz=1;
		tree[o*2].lsum=tree[o*2].rsum=tree[o*2].ans=0;
		tree[o*2+1].lsum=tree[o*2+1].rsum=tree[o*2+1].ans=0;
	}
	else{
		tree[o*2].laz=tree[o*2+1].laz=2;
		tree[o*2].lsum=tree[o*2].rsum=tree[o*2].ans=tree[o*2].len;
		tree[o*2+1].lsum=tree[o*2+1].rsum=tree[o*2+1].ans=tree[o*2+1].len;
	}
	tree[o].laz=0;
}
int query(int o,int l,int r,int x){
	pushdown(o);
	if(l==r)return l;
	int mid=(l+r)>>1;
	if(tree[o*2].ans>=x)return query(o*2,l,mid,x);
	else if(tree[o*2].rsum+tree[o*2+1].lsum>=x)return mid-tree[o*2].rsum+1;
	else return query(o*2+1,mid+1,r,x); 
}
void pushup(int o){
	tree[o].ans=max(tree[o*2].ans,max(tree[o*2+1].ans,tree[o*2].rsum+tree[o*2+1].lsum));
	if(tree[o*2].lsum==tree[o*2].len)tree[o].lsum=tree[o*2].len+tree[o*2+1].lsum;
	else tree[o].lsum=tree[o*2].lsum;
	if(tree[o*2+1].rsum==tree[o*2+1].rsum)tree[o].rsum=tree[o*2].rsum+tree[o*2+1].len;
	else tree[o].rsum=tree[o*2+1].rsum;
}
void change(int o,int l,int r,int L,int R,int op){
	pushdown(o);
	if(L<=l&&r<=R){
		if(op==1)tree[o].ans=tree[o].lsum=tree[o].rsum=0;
		else tree[o].ans=tree[o].lsum=tree[o].rsum=tree[o].len;
		tree[o].laz=op;
		return;
	}
	int mid=(l+r)>>1;
	if(L<=mid)change(o*2,l,mid,L,R,op);
	if(R>mid)change(o*2+1,mid+1,r,L,R,op);
	pushup(o);
}
int main(){
	scanf("%d%d",&n,&t);
	build(1,1,n);
	while(t--){
		int op,l,r,x;
		scanf("%d",&op);
		if(op==1){
			scanf("%d",&x);
			if(x>tree[1].ans)puts("0");
			else{
				int ans=query(1,1,n,x);
				printf("%d\n",ans);
				change(1,1,n,ans,ans+x-1,1);
			}
		}
		else{
			scanf("%d%d",&l,&r);
			change(1,1,n,l,r,2);
		}
	}
	return 0;
}
2023/11/17 21:10
加载中...