ryt47479 @ 2025-01-12 20:24:35
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int T=2e6+10;
int rt,cnt,seed=1;
struct node{
int ls,rs;
int key,val,siz;
}c[T];
struct r_pair{
int a,b;
r_pair(int a_=0,int b_=0){a=a_;b=b_;}
};
int pushup(int p){c[p].siz=c[c[p].ls].siz+c[c[p].rs].siz+1;}
int rnd(){return seed*=19932792323;}
int newnode(int k){
++cnt;
c[cnt].key=k,c[cnt].val=rnd();
c[cnt].siz=1;
return cnt;
}
r_pair split(int p,int k){
if(!p)return r_pair(0,0);
if(c[p].key<k){
r_pair x=split(c[p].rs,k);
c[p].rs=x.a;
pushup(p);
return r_pair(p,x.b);
}
else{
r_pair x=split(c[p].ls,k);
c[p].ls=x.b;
pushup(p);
return r_pair(x.a,p);
}
}
int merge(int u,int v){
if(!u||!v)return u+v;
if(c[u].val<c[v].val){
c[u].rs=merge(c[u].rs,v);
pushup(u);
return u;
}
else{
c[v].ls=merge(u,c[v].ls);
pushup(v);
return v;
}
}
void insert(int k){
int p=newnode(k);
r_pair y=split(rt,k);
rt=merge(y.a,merge(p,y.b));
}
void del(int k){
r_pair y=split(rt,k);
r_pair z=split(y.b,k+1);
z.a=merge(c[z.a].ls,c[z.a].rs);
rt=merge(y.b,merge(z.a,z.b));
}
int find(int k){
r_pair y=split(rt,k);
int ans=c[y.a].siz+1;
rt=merge(y.a,y.b);
return ans;
}
int kth(int x){
int p=rt;
while(p){
if(c[c[p].ls].siz+1==x)return c[p].key;
if(c[c[p].ls].siz>=x)p=c[p].ls;
else x-=c[c[p].ls].siz+1,p=c[p].rs;
}
}
int lst(int x){return kth(find(x)-1);}
int nxt(int x){return kth(find(x+1));}
int n,m;
signed main(){
ios::sync_with_stdio(false);
cin.tie(0);
cin>>n>>m;
while(n--){
int x;cin>>x;
insert(x);
}
int ans=0;
int k=0;
while(m--){
int op,x;cin>>op>>x;
x^=ans;
if(op==1){insert(x);}
if(op==2){del(x);}
if(op==3){ans=find(x);k^=ans;}
if(op==4){ans=kth(x);k^=ans;}
if(op==5){ans=lst(x);k^=ans;}
if(op==6){ans=nxt(x);k^=ans;}
}
cout<<k;
return 0;
}
全MLE了,求救
by ryt47479 @ 2025-01-12 20:34:47
已解决,此贴结