#include <iostream>
#include <unordered_map>
#include <set>
#include <algorithm>
using namespace std;
struct student {
int id;
int score;
};
// operator 암기 필수!
bool operator<(const student& a, const student& b) {
if (a.score != b.score) { return a.score < b.score; }
return a.id < b.id;
}
// score가 다르면 score 내림차순, 같으면 id 내림차순
set<student> st[3][2]; //set을 3차원으로 쓴다
unordered_map<int, tuple<int, int, int> > um; //3가지 정보 저장 위해 hash 사용
void init() {
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 2; j++) {
st[i][j].clear();
}
}
um.clear();
return;
}
int add(int mid, int grade, char gender[7], int score) {
// 0번째 index를 1학년으로 생각하기 위해
--grade;
// 첫문자 비교로 남녀 결정
auto& tmp = st[grade][gender[0] == 'm'];
tmp.insert({ mid, score });
// 3가지 정보 가져오기
um[mid] = { grade, gender[0] == 'm', score };
// reverse begin으로 mGrade, mGender중에 점수 가장높은애 return
return tmp.rbegin()->id;
}
int remove(int mid) {
//해당하는 ID 학생 없으면 0 return
if (um.count(mid) == 0) { return 0; } //unordered_map.count!!
int grade, gender, score;
tie(grade, gender, score) = um[mid];
auto& tmp = st[grade][gender];
tmp.erase({ mid, score });
um.erase(mid);
if (tmp.empty()) {
return 0;
}
return tmp.begin()->id;
}
int query(int gradecnt, int mGrade[], int mGenderCnt, char mGender[][7], int mScore) {
student ans = { 0, (int)1e9 }; //(int)1e9
for (int i = 0; i < gradecnt; i++) {
int grade = mGrade[i] - 1; //index 맞춰주기 위해서 --
for (int j = 0; j < mGenderCnt; j++) {
int gender = (mGender[j][0] == 'm');
auto& tmp = st[grade][gender];
// lower_bound로 id가 0보다 크고 mScore보다 큰 첫번째 index
auto it = tmp.lower_bound({ 0,mScore });
if (it != tmp.end()) {
if (*it < ans) { //비교 연산자 사용
ans = *it;
}
}
}
}
return ans.id;
}