hyfzelda @ 2023-01-13 10:30:40
rt
#include<bits/stdc++.h>
using namespace std;
#define int long long
struct node{
int son[2],size,val,dat,cnt;
}a[2000005];
int cnt,rt;
const int inf=1e9;
int point(int va)
{
a[++cnt].val=va;
a[cnt].dat=rand();
a[cnt].size=1;
a[cnt].cnt=1;
return cnt;
}
void push_up(int now)
{
a[now].size=a[a[now].son[0]].size+a[a[now].son[1]].size+a[now].cnt;
}
void build()
{
rt=point(-inf),
a[rt].son[1]=point(inf);
push_up(rt);
}
void rotate(int &now,int flag)
{
int tmp=a[now].son[flag^1];
a[now].son[flag^1]=a[tmp].son[flag];
a[tmp].son[flag]=now;
now=tmp;
push_up(a[now].son[flag]);
push_up(now);
}
void insert(int &now,int va)
{
if(!now)
{
now=point(va);
return;
}
if(va==a[now].val) a[now].cnt++;
else{
bool tmp;
if(va<a[now].val) tmp=0;
else tmp=1;
insert(a[now].son[tmp],va);
if(a[now].dat<a[a[now].son[tmp]].dat)
{
rotate(now,tmp^1);
}
}
push_up(now);
}
void _remove(int &now,int va)
{
if(!now) return;
if(va==a[now].val)
{
if(a[now].cnt>1)
{
a[now].cnt--;
push_up(now);
return;
}
if(a[now].son[0]||a[now].son[1])
{
if(!a[now].son[1]||a[a[now].son[0]].dat>a[a[now].son[1]].dat)
{
rotate(now,1);
_remove(a[now].son[1],va);
}
else
{
rotate(now,0);
_remove(a[now].son[0],va);
}
push_up(now);
}
else now=0;
return;
}
if(va<a[now].val)
{
_remove(a[now].son[0],va);
}
else _remove(a[now].son[1],va);
push_up(now);
}
int get_rank(int now,int va)
{
if(!now) return 1;
if(va==a[now].val)
{
return a[a[now].son[0]].size+1;
}
else if(va<a[now].val)
{
return get_rank(a[now].son[0],va);
}
else return a[a[now].son[0]].size+a[now].cnt+get_rank(a[now].son[1],va);
}
int get_val(int now,int num)
{
if(!now) return inf;
if(num<=a[a[now].son[0]].size) return get_val(a[now].son[0],num);
else if(num<=a[a[now].son[0]].size+a[now].cnt)
{
return a[now].val;
}
else return get_val(a[now].son[1],num-a[a[now].son[0]].size-a[now].cnt);
}
int get_pre(int va)
{
int now=rt;
int tmp;
while(now)
{
if(a[now].val<va)
{
tmp=a[now].val;
now=a[now].son[1];
}
else now=a[now].son[0];
}
return tmp;
}
int get_next(int va)
{
int now=rt;
int tmp;
while(now)
{
if(a[now].val>va)
{
tmp=a[now].val;
now=a[now].son[0];
}
else now=a[now].son[1];
}
return tmp;
}
signed main()
{
srand(time(0));
build();
int q,ans=0,n,tmp=0,sum=0;
scanf("%lld%lld",&n,&q);
for(int i=1;i<=n;i++)
{
int a;
scanf("%lld",&a);
insert(rt,a);
}
int last=0;
while(q--)
{
int op,x;
scanf("%lld%lld",&op,&x);
x=x^last;
if(op==1) insert(rt,x);
else if(op==2) _remove(rt,x);
else if(op==3) last=(get_rank(rt,x)),ans^=last,sum+=ans;
else if(op==4) last=get_val(rt,x+1),ans^=last,sum+=ans;
else if(op==5) last=get_pre(x),ans^=last,sum+=ans;
else last=get_next(x),ans^=last,sum+=ans;
}
printf("%lld",ans);
return 0;
}
by fjy666 @ 2023-01-13 14:13:21
温馨提示:楼主刚学 OI 大概半年。
by hyfzelda @ 2023-01-13 14:53:53
求助神犇
by __ATRI__ @ 2023-01-14 20:47:39
如果没有人回应你,可能说明你的这个问题需要一点时间思考,或者没有人明白你在问什么,所以请不要发“捞”。
by __ATRI__ @ 2023-01-14 20:48:26
遇到这种问题建议把测试结果的链接发出来。
虽然我也不太会
by MiniLong @ 2023-01-14 20:51:48
orz
by Erotate @ 2023-01-15 10:25:13
某种意义上来说,楼主只学了三个月的 OI。