74ptsRE求助
查看原帖
74ptsRE求助
602932
NumberTrart楼主2024/8/29 22:02
#include <algorithm>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <deque>
#include <list>
#include <map>
#include <iomanip>
#include <iostream>
#include <queue>
#include <set>
#include <stack>
#include <string>
#include <unistd.h>
#include <vector>
#include <bitset>
using namespace std;
const int N=50005,M=50005;
const int FROML=1,FROMR=2,FROMM=4,FROMLL=8,FROMRR=16;
const int SIGN1=1,SIGN0=2;
int n,m;
struct node
{
	int l,r;
	int ans,lans,rans;
	int from;
	int lazy;
	inline int len()
	{
		return r-l+1;
	}
} a[N*4];
void pushup(int p)
{
	int L,R,M,maxx,LL,RR;
	LL=a[p<<1].ans;
	RR=a[p<<1|1].ans;
	if(a[p<<1].lans==a[p<<1].len()) L=a[p<<1].lans+a[p<<1|1].lans;
	else L=a[p<<1].lans;
	if(a[p<<1|1].rans==a[p<<1|1].len()) R=a[p<<1|1].rans+a[p<<1].rans;
	else R=a[p<<1|1].rans;
	M=a[p<<1].rans+a[p<<1|1].lans;
	maxx=max(max(max(L,R),max(LL,RR)),M);
	a[p].ans=maxx;
	a[p].lans=L;
	a[p].rans=R;
	a[p].from=0;
	if(maxx==L) a[p].from|=FROML;
	if(maxx==R) a[p].from|=FROMR;
	if(maxx==M) a[p].from|=FROMM;
	if(maxx==LL) a[p].from|=FROMLL;
	if(maxx==RR) a[p].from|=FROMRR;
	a[p].lazy=0;
}
void build(int p,int l,int r)
{
	a[p].l=l;
	a[p].r=r;
	if(r==l)
	{
		a[p].ans=a[p].lans=a[p].rans=1;
		a[p].lazy=0;
		a[p].from=7;
		return;
	}
	int mid=(l+r)/2;
	build(p<<1,l,mid);
	build(p<<1|1,mid+1,r);
	pushup(p);
}
void pushdown(int p)
{
	if(a[p].lazy==SIGN0)
	{
		a[p].lazy=0;
		a[p<<1].lazy=SIGN0;
		a[p<<1|1].lazy=SIGN0;
		a[p<<1].ans=a[p<<1].lans=a[p<<1].rans=a[p<<1].len();
		a[p<<1].from=7;
		a[p<<1|1].ans=a[p<<1|1].lans=a[p<<1|1].rans=a[p<<1|1].len();
		a[p<<1|1].from=7;
	}
	if(a[p].lazy==SIGN1)
	{
		a[p].lazy=0;
		a[p<<1].lazy=SIGN1;
		a[p<<1|1].lazy=SIGN1;
		a[p<<1].ans=a[p<<1].lans=a[p<<1].rans=0;
		a[p<<1].from=7;
		a[p<<1|1].ans=a[p<<1|1].lans=a[p<<1|1].rans=0;
		a[p<<1|1].from=7;
	}
}
void sign(int p,int l,int r,int x)
{
	pushdown(p);
	if(l<=a[p].l&&a[p].r<=r)
	{
		if(x==1)
		{
			a[p].ans=a[p].lans=a[p].rans=0;
			a[p].lazy=SIGN1;
//			cout<<"signed:"<<a[p].l<<'~'<<a[p].r<<'\n';
		}
		else
		{
			a[p].ans=a[p].lans=a[p].rans=a[p].len();
			a[p].lazy=SIGN0;
//			cout<<"signed:"<<a[p].l<<'~'<<a[p].r<<'\n';
		}
		return;
	}
	int mid=(a[p].l+a[p].r)/2;
	if(l<=mid) sign(p<<1,l,r,x);
	if(mid+1<=r) sign(p<<1|1,l,r,x);
	pushup(p);
//	cout<<a[p].l<<'~'<<a[p].r<<":ans"<<a[p].ans<<" lans"<<a[p].lans<<" rans"<<a[p].rans<<" from"<<a[p].from<<'\n';
}
int findsign1(int p,int x)
{
	if(a[p].len()==1)
	{
		return a[p].l;
	}
	pushdown(p);
	int mid=(a[p].l+a[p].r)/2;
	if(a[p<<1].ans>=x)
		return findsign1(p<<1,x);
	else if(a[p<<1].rans+a[p<<1|1].lans>=x)
		return mid-a[p<<1].rans+1;
	else
		return findsign1(p<<1|1,x);
}
int main(){
	ios::sync_with_stdio(false);
	cin>>n>>m;
	build(1,1,n);
	for(int i=1;i<=m;i++)
	{
		int op,x,y;
		cin>>op>>x;
		if(op==1)
			if(a[1].ans<x)
			{
				cout<<"0\n";
				continue;
			}
			else
			{
				cout<<findsign1(1,x)<<'\n';
				sign(1,findsign1(1,x),findsign1(1,x)+x-1,1);
			}
		else
		{
			cin>>y;
			sign(1,x,x+y-1,0);
		}
	}
	return 0;
}
2024/8/29 22:02
加载中...