#include <iostream>
#include <string>
#include <vector>
#include <unordered_map>
#include <algorithm>
#include <sstream>
using namespace std;
struct User {
string name;
int score;
int timestamp; // 上传时间,用于处理同分情况
};
class RankingSystem {
private:
vector<User> users; // 按排名排序的用户列表
unordered_map<string, User*> userMap; // 用户名到用户指针的映射
int currentTime; // 当前时间戳
// 比较函数:按分数降序,分数相同时按时间戳升序(先上传的靠前)
static bool compareUsers(const User& a, const User& b) {
if (a.score != b.score) {
return a.score > b.score;
}
return a.timestamp < b.timestamp;
}
// 重新排序用户
void sortUsers() {
sort(users.begin(), users.end(), compareUsers);
}
public:
RankingSystem() : currentTime(0) {}
// Upload操作
void upload(const string& name, int score) {
// 如果用户已存在,删除旧记录
if (userMap.find(name) != userMap.end()) {
// 从vector中删除旧记录
for (auto it = users.begin(); it != users.end(); ++it) {
if (it->name == name) {
users.erase(it);
break;
}
}
}
// 创建新用户记录
User newUser;
newUser.name = name;
newUser.score = score;
newUser.timestamp = currentTime++;
// 添加到vector和map
users.push_back(newUser);
userMap[name] = &users.back();
// 重新排序
sortUsers();
}
// QueryByName操作
int queryByName(const string& name) {
if (userMap.find(name) == userMap.end()) {
return -1; // 用户不存在
}
// 查找用户排名(排名从1开始)
for (size_t i = 0; i < users.size(); ++i) {
if (users[i].name == name) {
return i + 1;
}
}
return -1;
}
// QueryByRank操作
vector<string> queryByRank(int rank) {
vector<string> result;
// rank是1-based的,转换为0-based索引
int startIdx = rank - 1;
// 确保起始索引有效
if (startIdx < 0 || startIdx >= (int)users.size()) {
return result;
}
// 获取最多10个用户
for (int i = startIdx; i < (int)users.size() && i < startIdx + 10; ++i) {
result.push_back(users[i].name);
}
return result;
}
};
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int N;
cin >> N;
cin.ignore(); // 忽略换行符
RankingSystem system;
for (int i = 0; i < N; ++i) {
string line;
getline(cin, line);
// 解析操作类型
size_t colonPos = line.find(':');
if (colonPos == string::npos) {
continue; // 无效输入
}
string operation = line.substr(0, colonPos);
string args = line.substr(colonPos + 1);
if (operation == "Upload") {
// 解析用户名和分数
size_t spacePos = args.find(' ');
if (spacePos == string::npos) {
continue; // 无效输入
}
string name = args.substr(0, spacePos);
int score = stoi(args.substr(spacePos + 1));
system.upload(name, score);
}
else if (operation == "QueryByName") {
string name = args;
int rank = system.queryByName(name);
cout << rank << endl;
}
else if (operation == "QueryByRank") {
int rank = stoi(args);
vector<string> result = system.queryByRank(rank);
if (!result.empty()) {
for (size_t j = 0; j < result.size(); ++j) {
cout << result[j];
if (j < result.size() - 1) {
cout << " ";
}
}
}
cout << endl;
}
}
return 0;
}