如题,蒟蒻调了三个小时没调出来 马蜂正常,跟着董晓老师敲的
#include<bits/stdc++.h>
using namespace std;
#define int long long
void read(long long &ans)
{
ans=0;
bool flag=0;
char ch=getchar();
if(ch=='-')
{
ch=getchar();
flag=1;
}
while(ch<'0' || ch>'9') ch=getchar();
while(ch>='0' && ch<='9')
{
ans=ans*10+(ch^48);
ch=getchar();
}
if(flag) ans=-ans;
}
void write(long long temp)
{
if(temp<0)
{
temp=-temp;
putchar('-');
}
if(temp>=10)
{
write(temp/10);
}
putchar((temp%10)^48);
}
int n,idx,root,m;
int seed=1;
struct Node
{
int l;
int r;
int value;
int key;
int child;
}t[2000005];
int Newnode(int v)
{
idx++;
t[idx].value=v;
t[idx].child=1;
t[idx].key=(seed*=20070509);
return idx;
}
void Pushup(int p) {t[p].child=t[t[p].l].child+t[t[p].r].child+1;}
void Split(int p,int v,int &x,int &y)
{
if(p==0){x=0,y=0;return ;}
if(t[p].value<=v)
{
x=p;
Split(t[x].r,v,t[x].r,y);
}
else
{
y=p;
Split(t[y].l,v,x,t[y].l);
}
Pushup(p);
}
int Merge(int x,int y)
{
if(!x || !y) return x+y;
if(t[x].key<t[y].key)
{
t[x].r=Merge(t[x].r,y);
Pushup(x);
return x;
}
else
{
t[y].l=Merge(x,t[y].l);
Pushup(y);
return y;
}
}
void Insert(int v)
{
int z=Newnode(v);
int x,y;
Split(root,v,x,y);
root=Merge(Merge(x,z),y);
}
void Delete_all(int v)
{
int x,y,z;
Split(root,v,x,y);
Split(x,v-1,x,z);
root=Merge(x,y);
}
void Delete_one(int v)
{
int x,y,z;
Split(root,v,x,z);
Split(x,v-1,x,y);
y=Merge(t[y].l,t[y].r);
root=Merge(Merge(x,y),z);
}
int Get_k(int p,int k)
{
if(k==t[t[p].l].child+1) return p;
if(k>t[t[p].l].child+1) return Get_k(t[p].r,k-t[t[p].l].child-1 );
return Get_k(t[p].l,k);
}
int Get_pre(int v)
{
int x,y;
Split(root,v-1,x,y);
int ans=t[Get_k(x,t[x].child)].value;
root=Merge(x,y);
return ans;
}
int Get_post(int v)
{
int x,y;
Split(root,v,x,y);
int ans=t[Get_k(y,1)].value;
root=Merge(x,y);
return ans;
}
int Get_rank(int v)
{
if(v==0) return 1;
int x,y;
Split(root,v-1,x,y);
int ans=t[x].child+1;
root=Merge(x,y);
return ans;
}
int Get_nth_value(int k)
{
return t[Get_k(root,k)].value;
}
void solve1()
{
scanf("%lld",&n);
for(int i=1;i<=n;i++)
{
int opt,x;
scanf("%lld%lld",&opt,&x);
switch(opt)
{
case 1:{Insert(x);break;};
case 2:{Delete_one(x);break;}
case 3:{printf("%lld\n",Get_rank(x));break;}
case 4:{printf("%lld\n",Get_nth_value(x));break;}
case 5:{printf("%lld\n",Get_pre(x));break;}
case 6:{printf("%lld\n",Get_post(x));break;}
}
}
}
int lst,ans;
void solve2()
{
read(n);
read(m);
for(int i=1;i<=n;i++)
{
int x;
read(x);
Insert(x);
}
for(int i=1;i<=m;i++)
{
int x,opt;
read(opt);
read(x);
switch(opt)
{
case 1:{Insert(x^lst);break;};
case 2:{Delete_one(x^lst);break;}
case 3:{lst=Get_rank(x);ans^=lst;write(ans);break;}
case 4:{lst=Get_nth_value(x);ans^=lst;write(ans);break;}
case 5:{lst=Get_pre(x);ans^=lst;write(ans);break;}
case 6:{lst=Get_post(x);ans^=lst;write(ans);break;}
}
}
}
signed main()
{
srand(time(0));
// solve1();
solve2();
return 0;
}