#6pts求助
查看原帖
#6pts求助
1358038
Tgdoem楼主2025/8/5 14:50
#include<bits/stdc++.h>
#define ll l
#define lr ((l+r)>>1)
#define rl ((l+r)>>1)+1
#define rr r
#define ls id<<1
#define rs id<<1|1
using namespace std;
const int N=5e4+5;
struct T{
	int la;
	int lo;
	int ma;
	int MFL;
	int MFR;
}tr[N<<2];
void up_change(int id){
	T *F=&tr[id];
	T *L=&tr[ls];
	T *R=&tr[rs];
	F->ma=max(max(L->ma,R->ma),L->MFR+R->MFL);
	F->MFL=L->MFL+(L->MFL==L->lo?R->MFL:0);
	F->MFR=R->MFR+(R->MFR==R->lo?L->MFR:0);
	return ;
}
void down_change(int id){
	T *F=&tr[id];
	T *L=&tr[ls];
	T *R=&tr[rs];
	if(!F->la)return ;
	L->la=R->la=F->la;
	L->ma=L->MFL=L->MFR=(F->la==1?0:L->lo);
	R->ma=R->MFL=R->MFR=(F->la==1?0:R->lo);
	F->la=0;
	return ;
}
void build(int l,int r,int id=1){
	tr[id].lo=tr[id].ma=tr[id].MFL=tr[id].MFR=r-l+1;
	if(l==r)return ;
	build(ll,lr,ls);
	build(rl,rr,rs);
	return ;
}
void change(int l,int r,int wl,int wr,int wish,int id=1){
	if(wl<=l&&r<=wr){
		T *F=&tr[id];
		F->ma=F->MFL=F->MFR=(wish==1?0:F->lo);
		F->la=wish;
		return ;
	}
	down_change(id);
	if(wl<=lr)change(ll,lr,wl,wr,wish,ls);
	if(rl<=wr)change(rl,rr,wl,wr,wish,rs);
	up_change(id);
	return ;
}
int find(int l,int r,int wish,int id=1){
	if(l==r)return l; 
	T *L=&tr[ls];
	T *R=&tr[rs];
	if(L->ma>=wish)return find(ll,lr,wish,ls);
	if(L->MFR+R->MFL>=wish)return lr-L->MFR+1;
	if(R->ma>=wish)return find(rl,rr,wish,rs);
	return -1;
}
int main(){
	int n,m;
	cin>>n>>m;
	build(1,n);
	while(m--){
		int id;
		cin>>id;
		if(id==1){
			int x;
			cin>>x;
			int l=find(1,n,x);
			if(l==-1)cout<<"0\n";
			else cout<<l<<"\n",change(1,n,l,l+x-1,1);
		}else{
			int x,y;
			cin>>x>>y;
			change(1,n,x,x+y-1,2);
		}
	}
	return 0;
} 
2025/8/5 14:50
加载中...