bdfz_2024_summer/day10/U88589/U88589.cpp
2024-08-12 10:07:56 +08:00

121 lines
2.9 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
[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;
}