题目描述
您需要写一种数据结构,来维护一些数( 都是 10910^9109 以内的数字)的集合,最开始时集合是空的。其中需要提供以下操作,操作次数 qqq 不超过 10410^4104:
查询 xxx 数的排名(排名定义为比当前数小的数的个数 +1+1+1。若有多个相同的数,因输出最小的排名)。 查询排名为 xxx 的数。 求 xxx 的前驱(前驱定义为小于 xxx,且最大的数)。若未找到则输出 −2147483647-2147483647−2147483647。 求 xxx 的后继(后继定义为大于 xxx,且最小的数)。若未找到则输出 214748364721474836472147483647。 插入一个数 xxx。
输入格式
无 输出格式
无 输入输出样例 输入 #1
7 5 1 5 3 5 5 1 3 2 2 3 3 4 3
输出 #1
2 3 1 5
#include <iostream> #include <algorithm> #include <vector> #include <climits> using namespace std; int main() { int n; cin >> n; vector<int>v; int id, data; for(int i = 1; i <= n; i++) { cin >> id >> data; if(id == 1) { int x = lower_bound(v.begin(), v.end(), data) - v.begin(); cout << x + 1 << endl; } else if(id == 2) { cout << v[data - 1] << endl; } else if(id == 3) { int x = lower_bound(v.begin(), v.end(), data) - v.begin(); if(x == 0) cout << -INT_MAX << endl; else cout << v[x - 1] << endl; } else if(id == 4) { int x = upper_bound(v.begin(), v.end(), data) - v.begin(); if(x == v.size()) cout << INT_MAX << endl; else cout << v[x] << endl; } else if(id == 5) { int x = lower_bound(v.begin(), v.end(), data) - v.begin(); v.insert(v.begin() + x, data); } } return 0; }