HHYQ_07 @ 2023-10-05 23:31:24
空间爆了,这种情况还有救吗?
#include<bits/stdc++.h>
using namespace std;
#define reg register
const int N=8e6+5;
int tot;
struct node
{
int ls,rs,delta;
}t[N];
inline void add(int &p,int l,int r,int x,int k)
{
if(!p)p=++tot;
if(l==r)
{
t[p].delta+=k;
return;
}
int mid=(l+r)>>1;
if(x<=mid)add(t[p].ls,l,mid,x,k);
else add(t[p].rs,mid+1,r,x,k);
t[p].delta=t[t[p].ls].delta+t[t[p].rs].delta;
return;
}
inline int query_pos(int p,int l,int r,int L,int R)
{
if(L<=l&&r<=R)return t[p].delta;
int mid=(l+r)>>1,ans=0;
if(L<=mid)ans+=query_pos(t[p].ls,l,mid,L,R);
if(mid<R)ans+=query_pos(t[p].rs,mid+1,r,L,R);
return ans;
}
inline int query_kth(int p,int l,int r,int k)
{
if(l==r)return l;
int mid=(l+r)>>1;
if(k<=t[t[p].ls].delta)return query_kth(t[p].ls,l,mid,k);
else return query_kth(t[p].rs,mid+1,r,k-t[t[p].ls].delta);
}
int main()
{
reg int n,m,opt,x,inf=(1<<30),root=0,lastans=0,ans=0;
cin>>n>>m;
while(n--)
{
cin>>x;
add(root,0,inf,x,1);
}
while(m--)
{
cin>>opt>>x;
x^=lastans;
if(opt==1)add(root,0,inf,x,1);
else if(opt==2)add(root,0,inf,x,-1);
else if(opt==3)lastans=query_pos(1,0,inf,0,x-1)+1;
else if(opt==4)lastans=query_kth(1,0,inf,x);
else if(opt==5)lastans=query_kth(1,0,inf,query_pos(1,0,inf,0,x-1));
else lastans=query_kth(1,0,inf,query_pos(1,0,inf,0,x)+1);
if(opt>=3)ans^=lastans;
}
cout<<ans;
return 0;
}