121 lines
2.9 KiB
C++
121 lines
2.9 KiB
C++
/*
|
||
[set容器]
|
||
- `1 x`: 插入一个值为 $x$ 的数;
|
||
|
||
- `2 x`: 删除一个值为 $x$ 的数,保证存在,若有多个只删除 $1$ 个;
|
||
|
||
- `3 l r`: 询问所有满足 $l\le x\le r$ 的 $x$ 的和;[排序]
|
||
|
||
- `4 x`: 询问集合中 <= x 的最大数,若没有输出 `-1`;
|
||
|
||
- `5 x`: 询问集合中 >= x 的最小数,若没有输出 `-1`;
|
||
|
||
1 2
|
||
|
||
*/
|
||
|
||
#include<bits/stdc++.h>
|
||
using namespace std;
|
||
#define int long long
|
||
|
||
const int MAX_X=1e5+5;
|
||
int q;
|
||
vector<int>v(MAX_X);
|
||
set<int> s;
|
||
int getint();
|
||
|
||
signed main(signed argc,char *argv[]){
|
||
#ifdef OITEST
|
||
cout<<"TESTING"<<endl;
|
||
#define AS(c){if(!(c)){cerr<<"assert failed:"<<#c<<endl;return -1;}}
|
||
#define ASM(a,b){if((a)!=(b)){cerr<<"assert failed: "<<a<<endl<<b<<endl;return 1;}}
|
||
AS(argc==3)
|
||
auto fin = freopen(argv[1],"r",stdin);
|
||
AS(fin!=NULL)
|
||
ifstream afile(argv[2]);
|
||
stringstream ss;
|
||
#define cout ss
|
||
int ans_num = 0;
|
||
#endif
|
||
q=getint();
|
||
for(int i=1;i<=q;i++){
|
||
const int n=getint();
|
||
#ifdef OITEST
|
||
if(n>=3){
|
||
ans_num++;
|
||
}
|
||
#endif
|
||
if(n==1){
|
||
const int x=getint();
|
||
/*auto state = */s.insert(x);
|
||
if(x>=v.size())v.resize(x+1);
|
||
v[x]++;
|
||
}else if (n==2) {
|
||
const int x=getint();
|
||
v[x]--;
|
||
if(v[x]==0){s.erase(x);}
|
||
}else if(n==3){
|
||
const int l=getint(),r=getint();
|
||
const auto sl=s.lower_bound(l)
|
||
,sr=s.lower_bound(r);
|
||
int ans=0;
|
||
for(auto i=sl;i!=sr;i++){
|
||
ans+=(*i)*v[(*i)];
|
||
}
|
||
if ((*sr)==r) {
|
||
ans+=(*sr)*v[(*sr)];
|
||
}
|
||
cout<<ans<<endl;
|
||
}else if(n==4){
|
||
const int x=getint();
|
||
// if(x==99){
|
||
// cerr<<"debugging"<<endl;
|
||
// }
|
||
auto it=s.lower_bound(x);
|
||
if((*it)==x){
|
||
cout<<x<<endl;
|
||
continue;
|
||
}else{
|
||
it--;
|
||
if((*it)<x){
|
||
cout<<(*it)<<endl;
|
||
continue;
|
||
}else{
|
||
cout<<-1<<endl;
|
||
continue;
|
||
}
|
||
}
|
||
cout<<(*it)<<endl;
|
||
}else if(n==5){
|
||
const int x=getint();
|
||
auto it=s.lower_bound(x);
|
||
if(it==s.end()){
|
||
cout<<-1<<endl;
|
||
continue;
|
||
}
|
||
cout<<(*it)<<endl;
|
||
}
|
||
}
|
||
#ifdef OITEST
|
||
for(int i=1;i<=ans_num;i++){
|
||
int cans ,myans;
|
||
afile>>cans;
|
||
ss>>myans;
|
||
ASM(cans,myans)
|
||
}
|
||
#endif
|
||
}
|
||
|
||
int getint(){
|
||
int x=0,w=1;
|
||
char ch=0;
|
||
while(!isdigit(ch)){
|
||
if(ch=='-')w=-1;
|
||
ch=getchar();
|
||
}
|
||
while(isdigit(ch)){
|
||
x=x*10+(ch-'0');
|
||
ch=getchar();
|
||
}
|
||
return x*w;
|
||
} |