调吐了,8分求助啊!!
查看原帖
调吐了,8分求助啊!!
419930
怎么肥4楼主2022/11/18 21:30
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int N=5e4+5;
int n,m,ans;
struct segment{
	int l,r,sum,lsum,rsum,tag;
	#define l(x) tree[x].l
	#define r(x) tree[x].r
	#define sum(x) tree[x].sum
	#define lsum(x) tree[x].lsum
	#define rsum(x) tree[x].rsum 
	#define tag(x) tree[x].tag
}tree[N<<2];
void build(int p,int l,int r)
{
	l(p)=l;r(p)=r;
	if(l==r){
		sum(p)=lsum(p)=rsum(p)=1;
		return;
	}
	int mid=(l+r)>>1;
	build(p<<1,l,mid);
	build(p<<1|1,mid+1,r);
	sum(p)=lsum(p)=rsum(p)=sum(p<<1)+sum(p<<1|1);
}
void pushdown(int p)
{
	if(tag(p)==1){
		tag(p)=0;
		tag(p<<1)=tag(p<<1|1)=1;
		sum(p<<1)=lsum(p<<1)=rsum(p<<1)=0;
		sum(p<<1|1)=lsum(p<<1|1)=rsum(p<<1|1)=0;
	}
	else if(tag(p)==2){
		tag(p)=0;
		tag(p<<1)=tag(p<<1|1)=2;
		sum(p<<1)=lsum(p<<1)=rsum(p<<1)=r(p<<1)-l(p<<1)+1;
		sum(p<<1|1)=lsum(p<<1|1)=rsum(p<<1|1)=r(p<<1|1)-l(p<<1|1)+1;
	}
}
void pushup(int p)
{
	sum(p)=max(max(sum(p<<1),sum(p<<1|1)),rsum(p<<1)+lsum(p<<1|1));
	lsum(p)=lsum(p<<1)+(lsum(p<<1)==sum(p<<1)&&sum(p<<1))*lsum(p<<1|1);
	rsum(p)=rsum(p<<1|1)+(rsum(p<<1|1)==sum(p<<1|1)&&sum(p<<1|1))*rsum(p<<1);
}
int ask(int p,int k)
{
	if(sum(p)==r(p)-l(p)+1&&sum(p)==k) return l(p);
	pushdown(p);
	if(sum(p<<1)>=k) return ask(p<<1,k);
	else if(rsum(p<<1)+lsum(p<<1|1)>=k){
		return r(p<<1)-rsum(p<<1)+1;
	}
	else if(sum(p<<1|1)>=k) return ask(p<<1|1,k);
	pushup(p);
}
void change(int p,int l,int r,int flag)
{
	if(l<=l(p)&&r(p)<=r){
		if(flag==1) sum(p)=lsum(p)=rsum(p)=0;
		else if(flag==2) sum(p)=lsum(p)=rsum(p)=r(p)-l(p)+1;
		tag(p)=flag;return;
	}
	pushdown(p);
	int mid=(l(p)+r(p))>>1;
	if(l<=mid) change(p<<1,l,r,flag);
	if(r>mid) change(p<<1|1,l,r,flag);
	pushup(p);
}
int main()
{
	cin>>n>>m;
	build(1,1,n);
//	cout<<"QQQ"<<ask(1,3);
	while(m--){
		int opt,x,y;
		scanf("%d",&opt);
		if(opt==1){
			scanf("%d",&y);
			if(sum(1)>=y){
				x=ask(1,y),y=x+y-1;
				printf("%d\n",x);
				change(1,x,y,1);
			}
			else puts("0");
		}
		else {
			scanf("%d%d",&x,&y);
			change(1,x,x+y-1,2);
		}
	}
	return 0;
}
2022/11/18 21:30
加载中...