喂……咦?毙!

用处为 0……

唯一的板子……

//Just Sayori
#pragma GCC diagnostic ignored "-Wnarrowing"
#pragma GCC diagnostic ignored "-Wsign-compare"
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <bitset>
#include <vector>
#include <random>
#include <climits>
#include <map>
#define ll long long
#define ull unsigned long long
#define rnt register int
#define gr getchar
#define pr putchar
#define M 1000000007
//#define M 998244353
using namespace std;
inline ll read()
{
	ll x=0,f=1;
	char ch=gr();
	while (ch<'0' || ch>'9') ch=='-'?f=-1,ch=gr():ch=gr();
	while (ch>='0' && ch<='9') x=(x<<3)+(x<<1)+(ch^48),ch=gr();
	return x*f;
}
inline void write(ll x)
{
	static uint8_t stack[39],*top=stack+39;
	if (x<0) pr('-'),x=-x;
	do *(--top)=x%10^48,x/=10;
	while (x);
	fputs((char*)top,stdout);
}
namespace vEB
{
#define N 2000005
#define mn(x) s[x].mn
#define mx(x) s[x].mx
#define len(x) s[x].len
#define sum(x) s[x].summary
#define ch(x) s[x].ch
#define delete del
	struct node
	{
		int mn,mx,len,summary;
		vector<int> ch;
	}s[N];
	int cnt,root;
	map<int,int> lg;
	inline void init()
	{
		for (rnt i=0;i<31;i++) lg[1<<i]=i;
	}
	inline int high(int u,int x)
	{
		return x/(1<<(lg[len(u)]>>1));
	}
	inline int down(int u,int x)
	{
		return x%(1<<(lg[len(u)]>>1));
	}
	inline int index(int u,int x,int y)
	{
		return x*(1<<(lg[len(u)]>>1))+y;
	}
	inline void build(int &u,int sz,int son_sz=0)
	{
		u=++cnt,mn(u)=mx(u)=sum(u)=-1;
		if (sz<=1) return len(u)=2,void();
		len(u)=1<<sz,son_sz=(sz>>1)+(sz&1);
		build(sum(u),son_sz);
		ch(u).resize(1<<son_sz);
		for (rnt i=0;i<1<<son_sz;i++) build(ch(u)[i],sz>>1);
	}
	inline bool get_exist(int u,int x)
	{
		if (x==mn(u) || x==mx(u)) return 1;
		if (len(u)==2) return 0;
		return get_exist(ch(u)[high(u,x)],down(u,x));
	}
	inline int get_mn(int u)
	{
		return mn(u);
	}
	inline int get_mx(int u)
	{
		return mx(u);
	}
	inline int get_pre(int u,int x,int p=0)
	{
		if (len(u)==2)
		{
			if (x==1 && mn(u)==0) return 0;
			else return -1;
		}
		if (~mx(u) && mx(u)<x) return mx(u);
		p=get_mn(ch(u)[high(u,x)]);
		if (~p && down(u,x)>p) return index(u,high(u,x),get_pre(ch(u)[high(u,x)],down(u,x)));
		p=get_pre(sum(u),high(u,x));
		if (p==-1) 
		{
			if (~mn(u) && mn(u)<x) return mn(u);
			else return -1;
		}
		return index(u,p,get_mx(ch(u)[p]));
	}
	inline int get_suf(int u,int x,int p=0)
	{
		if (len(u)==2) 
		{
			if (x==0 && mx(u)==1) return 1;
			else return -1;
		}
		if (~mn(u) && mn(u)>x) return mn(u);
		p=get_mx(ch(u)[high(u,x)]);
		if (~p && down(u,x)<p) return index(u,high(u,x),get_suf(ch(u)[high(u,x)],down(u,x)));
		p=get_suf(sum(u),high(u,x));
		if (p==-1) return -1;
		return index(u,p,get_mn(ch(u)[p]));
	}
	inline void set(int u,int x)
	{
		mn(u)=mx(u)=x;
	}
	inline void insert(int u,int x)
	{
		if (!~mn(u)) return set(u,x);
		if (x<mn(u)) swap(x,mn(u));
		if (len(u)>2)
		{
			if (!~get_mn(ch(u)[high(u,x)])) insert(sum(u),high(u,x)),set(ch(u)[high(u,x)],down(u,x));
			else insert(ch(u)[high(u,x)],down(u,x));
		}
		if (x>mx(u)) mx(u)=x;
	}
	inline void delete(int u,int x,int p=0)
	{
		if (mn(u)==x && mx(u)==x) return mn(u)=mx(u)=-1,void();
		if (len(u)==2) return mn(u)=mx(u)=x^1,void();
		if (mn(u)==x)
		{
			int p=get_mn(sum(u));
			x=mn(u)=index(u,p,get_mn(ch(u)[p]));
		}
		delete(ch(u)[high(u,x)],down(u,x));
		if (!~get_mn(ch(u)[high(u,x)]))
		{
			delete(sum(u),high(u,x));
			if (mx(u)==x)
			{
				p=get_mx(sum(u));
				if (!~p) mx(u)=mn(u);
				else mx(u)=index(u,p,get_mx(ch(u)[p]));
			}
		}
		else 
			if (mx(u)==x) mx(u)=index(u,high(u,x),get_mx(ch(u)[high(u,x)]));
	}
#undef N
}
using namespace vEB;
int main()
{
	int n=read(),m=read(),u=0;
	for (rnt m=n-1;m;m>>=1,u++);
	init(),build(root,u);
	for (rnt i=1,x;i<=m;i++)
		switch(read())
	{
	case 1:
		x=read();
		if (!get_exist(root,x)) insert(root,x);
		break;
	case 2:
		x=read();
		if (get_exist(root,x)) delete(root,x);
		break;
	case 3:
		cout<<get_mn(root)<<"\n";
		break;
	case 4:
		cout<<get_mx(root)<<"\n";
		break;
	case 5:
		x=read(),cout<<get_pre(root,x)<<"\n";
		break;
	case 6:
		x=read(),cout<<get_suf(root,x)<<"\n";
		break;
	case 7:
		x=read(),cout<<(get_exist(root,x)?1:-1)<<"\n";
		break;
	}
	return 0;
}
posted @ 2026-04-24 21:50  某三年的无用名称  阅读(35)  评论(0)    收藏  举报