喂……咦?毙!
用处为 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;
}

浙公网安备 33010602011771号