我做这道题并不是想A它,主要是练一下平衡树,所以写了个平衡树,WA*4 TLE*3,T掉我认了,为什么前面会WA?在苦思无果后用了std::set
,错误一模一样。
应该不是我平衡树的锅,所以这里就放我第二份代码了(set的)
#include<bits/stdc++.h>
//#define int long long
using namespace std;
inline int read(){
int x=0,f=1;char ch=getchar();
while (!isdigit(ch)){if (ch=='-') f=-1;ch=getchar();}
while (isdigit(ch)){x=x*10+ch-48;ch=getchar();}
return x*f;
}
void print(int a){
if(a<0)putchar('-'),a=-a;
if(a>=10)print(a/10);
putchar(a%10+48);
}
set<int>T;
int n=read(),m=read(),last;
signed main(){
T.insert(-1);
int ans=0;
while(m--){
int op=read();
switch(op){
case 1:{
int x=read()+last;
T.insert(x);
break;
}
case 2:{
int x=read()+last;
T.erase(x);
break;
}
case 3:{
auto it=T.begin();it++;
ans+=(last=*it);
break;
}
case 4:{
if(T.empty()){ans+=(last=-1);break;}
auto it=T.end();it--;ans+=(last=*it);
break;
}
case 5:{
ans+=(last=T.size()-1);
break;
}
case 6:{
int x=read()+last;
ans+=(last=T.count(x));
break;
}
case 7:{
int x=read()+last;
auto val=T.lower_bound(x);val--;
ans+=(last=*val);
break;
}
case 8:{
int x=read()+last;
auto val=T.lower_bound(x);
ans+=(last=(val==T.end()?-1:*val));
break;
}
}
}
print(ans);
return ~EOF;
}