Untitled

mail@pastecode.io avatar
unknown
plain_text
a year ago
48 kB
30
Indexable
Never
[Nguyễn Văn Vang / Nguyen Van Vang]
#include <iostream>
#include <unordered_map>
#include <string>

using namespace std;

class student{
public:
    string name;
    int id;
    student(string name1, int id1){
        name=name1;
        id=id1;
    }

};

int main(){
    unordered_map<string,student *> mymap;
    student s1("abc",1);
    student s2("bcd",2);
    //them
    mymap["abc"]=&s1;
    mymap["bcd"]=&s2;
    //tim
    //unordered_map<string,student *>::iterator it;
    auto it = mymap.find("abc");
    if(it==mymap.end()){
        //ko thay
        cout<<"ko thay"<<endl;
    }
    else{
        student *s=it->second;
        cout<<"id: "<<s->id<<endl;
    }
    //xoa
    mymap.erase(s2.name);
    auto it1 = mymap.find(s2.name);
    if(it1==mymap.end()){
        //ko thay
        cout<<"ko thay"<<endl;
    }
    else{
        student *s=it1->second;
        cout<<"id: "<<s->id<<endl;
    }


    return 0;
}

[Phạm Quang Trà (Tra_광차_Tra) / Pham Quang Tra] 7/28/2023 17:25
#ifndef _CRT_SECURE_NO_WARNINGS
#define _CRT_SECURE_NO_WARNINGS
#endif

#include <stdio.h>

extern void init(int N);
extern void addProduct(int mPrice, int tagNum, char tagName[][10]);
extern int buyProduct(char tag1[], char tag2[], char tag3[]);
extern void adjustPrice(char tag1[], int changePrice);

/////////////////////////////////////////////////////////////////////////

#define INIT    0
#define ADD        1
#define BUY        2
#define ADJ        3

static void mstrcpy(char dst[], const char src[]) {
    int c = 0;
    while ((dst[c] = src[c]) != '\0') ++c;
}
static int mstrcmp(const char str1[], const char str2[]) {
    int c = 0;
    while (str1[c] != '\0' && str1[c] == str2[c]) ++c;
    return str1[c] - str2[c];
}

static bool run()
{
    int N, cmd, ans, ret, tnum, price;
    char tag[5][10];

    int Q = 0;
    bool okay = false;

    ret = ans = 0;
    okay = false;

    scanf("%d", &Q);
    for (int i = 0; i < Q; ++i)
    {
        scanf("%d", &cmd);
        switch (cmd)
        {
        case INIT:
            scanf("%d", &N);
            init(N);
            okay = true;
            break;
        case ADD:
            scanf("%d %d", &price, &tnum);
            for (int m = 0; m < tnum; m++) {
                scanf("%s", tag[m]);
            }
            addProduct(price, tnum, tag);
            break;
        case BUY:
            scanf("%d", &ans);
            for (int m = 0; m < 3; m++) {
                scanf("%s", tag[m]);
            }
            ret = buyProduct(tag[0], tag[1], tag[2]);
            if (ans != ret) {
                okay = false;
            }
            break;
        case ADJ:
            scanf("%s %d", tag[0], &price);
            adjustPrice(tag[0], price);
            break;
        default:
            okay = false;
        }
    }

    return okay;
}

int main()
{
    setbuf(stdout, NULL);
    //freopen("sample_input.txt", "r", stdin);

    int T, MARK;
    scanf("%d %d", &T, &MARK);

    for (int tc = 1; tc <= T; tc++)
    {
        int score = run() ? MARK : 0;
        printf("#%d %d\n", tc, score);
    }

    return 0;
}

[Phạm Quang Trà (Tra_광차_Tra) / Pham Quang Tra] 7/28/2023 17:25
note pad

[Phạm Quang Trà (Tra_광차_Tra) / Pham Quang Tra] 7/28/2023 17:26
#include<iostream>
using namespace std;
  
class Node {
public:
    char data;
    Node *pre;
    Node *next;
};
typedef class Node *node;
  
node creatNewnode(char c) {
    node temp = new Node();
    temp->data = c;
    temp->next = NULL;
    temp->pre = NULL;
    return temp;
}
  
void Linknode(node front, node end) {
    front->next = end;
    end->pre = front;
}
  
void insertNode(node front, node p, node end) {
    Linknode(front, p);
    Linknode(p, end);
}
  
void removeNode(node p) {
    Linknode(p->pre, p->next);
}
  
class cur {
public:
    int row;
    int col;
}mouse;
  
int h, w;  
int line;
  
class List {
public:
    Node *phead;
    Node *ptail;
    int size;
    int cnt[29];
}list[301];
  
void init(int H, int W, char mStr[]) {
    h = H; 
    w = W;
    mouse.col = mouse.row = 1;
  
    for (int i = 1; i <= h; i++) {
        list[i].size = 0;
        list[i].phead = new Node();
        list[i].ptail = new Node();
        Linknode(list[i].phead, list[i].ptail);
    }
  
    for (int i = 1; i <= h; i++) {
        for (int j = 0; j < 29; j++) {
            list[i].cnt[j] = 0;
        }
    }
    line = 1;
      
    for (int i = 0; mStr[i] != 0; i++) {
        node temp = creatNewnode(mStr[i]);
        insertNode(list[line].ptail->pre, temp, list[line].ptail);
        list[line].cnt[mStr[i] - 'a']++;
        list[line].size++;
        if (list[line].size >= w) {
            line++;
        }
    }
}
  
void insert(char mChar) {
    node temp = creatNewnode(mChar);
    int ha = mouse.row;
    int cot = mouse.col;
    node cur = list[ha].phead->next;
  
    for (int i = 1; i < cot; i++) {
        cur = cur->next;
    }
    insertNode(cur->pre, temp, cur);
    mouse.col++;
    list[ha].size++;
    list[ha].cnt[mChar - 'a']++;
  
    while (list[ha].size > w) {
        node temp = list[ha].ptail->pre;
        Linknode(temp->pre, temp->next);
        list[ha].size--;
        list[ha].cnt[temp->data - 'a']--;
        ha++;
        node cur = list[ha].phead;
        insertNode(cur, temp, cur->next);
        list[ha].size++;
        list[ha].cnt[temp->data - 'a']++;
    }
  
    if (ha > line) {
        line = ha;
    }
  
    if (mouse.col > w) {
        mouse.row++;
        mouse.col = 1;
    }
}
  
char moveCursor(int mRow, int mCol) {
    if (mRow > line || (mRow == line && mCol > list[line].size)) {
        mouse.row = line;
        mouse.col = list[line].size + 1;
        return '$';
    }
    mouse.col = mCol;
    mouse.row = mRow;
    node cur = list[mRow].phead->next;
  
    for (int i = 1; i < mCol; i++) {
        cur = cur->next;
    }
    return cur->data;
}
  
int countCharacter(char mChar) {
    int res = 0;
    for (int i = mouse.row; i <= line; i++) {
        res += list[i].cnt[mChar - 'a'];
    }
    node temp = list[mouse.row].phead->next;
  
    for (int i = 1; i < mouse.col; i++) {
        if (temp->data == mChar) {
            res--;
        }
        temp = temp->next;
    }
    return res;
}

[Phạm Quang Trà (Tra_광차_Tra) / Pham Quang Tra] 7/28/2023 17:26
number baseball

[Phạm Quang Trà (Tra_광차_Tra) / Pham Quang Tra] 7/28/2023 17:26
#define N 4
typedef class
{
public:
    int strike;
    int ball;
} Result;
int A[6000][4];
int Count;
extern Result query(int guess[]);
  
Result myquery(int guess[], int dest[]){
    Result result;
    result.strike=0;
    result.ball=0;
    for(int i = 0; i < N; i++){
        for(int j = 0; j < N; j++){
            if (i == j && guess[i] == dest[j])
                result.strike++;
            else if(i != j && guess[i] == dest[j])
                result.ball++;
        }
    }
    return result;
}
    
void mycopy(int src[], int dest[]){
    for(int i = 0; i < N; i++){
        dest[i] = src[i];
    }
}
void init(){
    int a,b,c,d;
    Count = 0;
    for (a=0;a<=9;a++){
        for (b=0;b<=9;b++){
            for (c=0;c<=9;c++){
                for (d=0;d<=9;d++){
                    if ((a!=b)&&(a!=c)&&(a!=d)&&(b!=c)&&(b!=d)&&(c!=d)){
                            A[Count][0]=a;
                            A[Count][1]=b;
                            A[Count][2]=c;
                            A[Count][3]=d;
                            Count ++;
                    }
                }
            }
        }
    }
}
  
void doUserImplementation(int inputD[])
{
    Result res, res1;
    init();
    while(Count>0){
        int countg = 0;
        mycopy(A[0], inputD);
        res = query(inputD);
        if(res.strike==4){ 
            return;
        }
        for(int i=1;i<Count;i++){
            res1 = myquery(inputD,A[i]);
            if(res.strike==res1.strike&&res.ball==res1.ball){
                mycopy(A[i],A[countg]);
                countg++;
            }
        }
        Count = countg;
    }
}

[Phạm Quang Trà (Tra_광차_Tra) / Pham Quang Tra] 7/28/2023 17:26
2hand market

[Phạm Quang Trà (Tra_광차_Tra) / Pham Quang Tra] 7/28/2023 17:26
#include <unordered_map>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
struct product
{
    int price;
    bool isDel;
};
product prd[30005];
unordered_map<string,vector<int>> umap;
int tagid;
void init(int N)
{
    umap.clear();
    tagid = 0;
}
  
void addProduct(int mPrice, int tagNum, char tagName[][10])
{
    prd[tagid].price = mPrice;
    prd[tagid].isDel = false;
    vector<string> TohopTag;
    for (int i = 0; i < tagNum; i++)
    {
        TohopTag.push_back(tagName[i]);
        umap[tagName[i]].push_back(tagid);
    }
    sort(TohopTag.begin(), TohopTag.end());
  
    for (int i = 0; i < tagNum; i++){
        for (int j = i+1; j < tagNum; j++){
            for (int k = j+1; k < tagNum; k++)
            {
                string longtag = TohopTag[i] + " " + TohopTag[j] + " " + TohopTag[k];
                umap[longtag].push_back(tagid);
            }
        }
    }
    tagid++;
}
  
int buyProduct(char tag1[], char tag2[], char tag3[])
{
    vector<string> TohopTag;
    TohopTag.push_back(tag1);
    TohopTag.push_back(tag2);
    TohopTag.push_back(tag3);
    sort(TohopTag.begin(), TohopTag.end());
    string longTag = TohopTag[0] + " " + TohopTag[1] + " " + TohopTag[2];
    int prdSelected = -1;
    for (auto it:umap[longTag])
    {
        if (prd[it].isDel == false)
        {
            if (prdSelected == -1 || prd[it].price < prd[prdSelected].price)
            {
                prdSelected = it;
            }
        }
    }
    if (prdSelected == -1) return -1;
    prd[prdSelected].isDel = true;
    return prd[prdSelected].price;
}
  
void adjustPrice(char tag1[], int changePrice)
{
    for (auto it:umap[tag1])
    {
        prd[it].price += changePrice;
    }
}

[Phạm Quang Trà (Tra_광차_Tra) / Pham Quang Tra] 7/28/2023 17:27
soldier

[Phạm Quang Trà (Tra_광차_Tra) / Pham Quang Tra] 7/28/2023 17:27
#define MAXSIZE 100001
#define NULL 0
   
class Soldier
{
public:
    int ID, teamID, Score;
    Soldier *next, *prev;
   
    Soldier(int id, int team, int score) {
        ID = id;
        teamID = team;
        Score = score;
        next = prev = nullptr;
    }
};
   
class DoubleLL
{
public:
    Soldier *head, *tail;
   
    DoubleLL()
    {
        head = new Soldier(-1, -1, -1);
        tail = new Soldier(-1, -1, -1);
        connect(head, tail);
    }
   
    void connect(Soldier *s1, Soldier *s2) 
    {
        s1->next = s2;
        s2->prev = s1;
    }
   
    void insSoldier(Soldier *newSol) 
    {
        connect(newSol, head->next);
        connect(head, newSol);
    }
};
   
class Team 
{
public:
    DoubleLL *arrScore[6];
   
    Team() 
    {
        for(int i=1; i<=5; i++) {
            arrScore[i] = new DoubleLL();
        }
    }
   
    void hideSol(Soldier *newSol, int score)
    {
        arrScore[score]->insSoldier(newSol);
    }
   
    void connectSol(Soldier *s1, Soldier *s2)
    {
        s1->next = s2;
        s2->prev = s1;
    }
   
    void updateTeam(int score)
    {
        int deltaScore = 0;
        if(score > 0) {
            for(int i = 4; i >= 1; i--) {
                if(arrScore[i]->head->next != arrScore[i]->tail) {
                    deltaScore = (i + score) > 5 ? 5 : (i + score);
                    connectSol(arrScore[deltaScore]->tail->prev, arrScore[i]->head->next);
                    connectSol(arrScore[i]->tail->prev, arrScore[deltaScore]->tail);
                    connectSol(arrScore[i]->head, arrScore[i]->tail);
                }
            }
        } else if(score < 0) {
            for(int i = 2; i <= 5; i++) {
                if(arrScore[i]->head->next != arrScore[i]->tail) {
                    deltaScore = (i + score) < 1 ? 1 : (i + score);
                    connectSol(arrScore[deltaScore]->tail->prev, arrScore[i]->head->next);
                    connectSol(arrScore[i]->tail->prev, arrScore[deltaScore]->tail);
                    connectSol(arrScore[i]->head, arrScore[i]->tail);
                }
            }
        }
    }
};
   
   
Team team[6];
Soldier *soldier[MAXSIZE];
   
void init()
{
    for(int i = 1; i <= 5; i++)
        team[i] = Team();
}
   
void hire(int mID, int mTeam, int mScore)
{
    Soldier *sol = new Soldier(mID, mTeam, mScore);
    team[mTeam].hideSol(sol, mScore);
    soldier[mID] = sol;
}
   
void fire(int mID)
{
    soldier[mID]->prev->next = soldier[mID]->next;
    soldier[mID]->next->prev = soldier[mID]->prev;
}
   
void updateSoldier(int mID, int mScore)
{
    fire(mID);
    soldier[mID]->Score = mScore;
    team[soldier[mID]->teamID].hideSol(soldier[mID], mScore);
}
   
void updateTeam(int mTeam, int mChangeScore)
{
    team[mTeam].updateTeam(mChangeScore);
}

[Phạm Quang Trà (Tra_광차_Tra) / Pham Quang Tra] 7/28/2023 17:27
int bestSoldier(int mTeam)
{
    int res = -1;
    for(int i = 5; i >= 1; i--) {
        if(team[mTeam].arrScore[i]->head->next != team[mTeam].arrScore[i]->tail) {
            Soldier *temp = team[mTeam].arrScore[i]->head->next;
            res = temp->ID;
            while(temp != team[mTeam].arrScore[i]->tail) {
                if(temp->ID > res)
                    res = temp->ID;
                temp = temp->next;
            }
            break;
        }
    }
    return res;
}

>> Monday, July 31, 2023

[Nguyễn Văn Vang / Nguyen Van Vang] 7/31/2023 17:39
#include <iostream>
#include <queue>
#include <unordered_map>
#include <vector>
#include <cstring>
 
using namespace std;
 
#define MAX_N 100002
#define MAX_GRP 11
#define MAX_JOB 1001
 
struct PASAGE {
    int id;
    int point;
    int groupid;
};
 
struct COM_UP {
    bool operator () (const PASAGE a, const PASAGE b) {
        if (a.point == b.point) {
            return a.id < b.id;
        }
        return a.point > b.point;
    }
};
struct COM_DOWN {
    bool operator () (const PASAGE a, const PASAGE b) {
        if (a.point == b.point) {
            return a.id > b.id;
        }
        return a.point < b.point;
    }
};
 
priority_queue<PASAGE, vector<PASAGE>, COM_UP> heap_small[MAX_GRP];
priority_queue<PASAGE, vector<PASAGE>, COM_DOWN> heap_big[MAX_GRP];
 
PASAGE org_vec[MAX_N];
vector<int> job_psgid[MAX_JOB];
 
int m_grougs;
 
void updataQueue(const int id) {
    heap_big[org_vec[id].groupid].emplace(org_vec[id]);
    heap_small[org_vec[id].groupid].emplace(org_vec[id]);
}
 
void init(int N, int M, int J, int mPoint[], int mJobID[])
{
    for (int i = 0; i < J; i++) {
        job_psgid[i].clear();
    }
    for (int i = 0; i < N / M; i++) {
        heap_big[i] = priority_queue<PASAGE, vector<PASAGE>, COM_DOWN>();
        heap_small[i] = priority_queue<PASAGE, vector<PASAGE>, COM_UP>();
    }

[Nguyễn Văn Vang / Nguyen Van Vang] 7/31/2023 17:39
  m_grougs = N / M;
 
    for (int i = 0; i < N; i++) {
        org_vec[i] = { i, mPoint[i], i / M };
        updataQueue(i);
        job_psgid[mJobID[i]].push_back(i);
    }
}
 
void destroy()
{
 
}
 
int update(int mID, int mPoint)
{
    org_vec[mID].point += mPoint;
    updataQueue(mID);
    return org_vec[mID].point;
}
 
int updateByJob(int mJobID, int mPoint)
{
    int ret_val = 0;
    for (const auto id : job_psgid[mJobID]) {
        org_vec[id].point += mPoint;
        updataQueue(id);
        ret_val += org_vec[id].point;
    }
    return ret_val;
}

[Nguyễn Văn Vang / Nguyen Van Vang] 7/31/2023 17:39
int move(int mNum)
{
    vector<int> up_vecs[MAX_GRP], down_vecs[MAX_GRP];
    // take num biggest value
    bool flag = false;
    for (int g = 1; g < m_grougs; g++) {
        int num = 0;
        while (num < mNum) {
            const auto heap_top = heap_big[g].top();
            heap_big[g].pop();
            if (heap_top.point != org_vec[heap_top.id].point || heap_top.groupid != org_vec[heap_top.id].groupid) {
                continue;
            }
 
            flag = false;
            for (auto t : up_vecs[g]) {
                if (t == heap_top.id) {
                    flag = true;
                    break;
                }
            }
            if (flag) continue;
 
            up_vecs[g].push_back(heap_top.id);
            num++;
        }
    }
 
    //take num less value
    for (int g = 0; g < m_grougs - 1; g++) {
        int num = 0;
        while (num < mNum) {
            const auto heap_top = heap_small[g].top();
            heap_small[g].pop();
            if (heap_top.point != org_vec[heap_top.id].point || heap_top.groupid != org_vec[heap_top.id].groupid) {
                continue;
            }
 
            flag = false;
            for (auto t : down_vecs[g]) {
                if (t == heap_top.id) {
                    flag = true;
                    break;
                }
            }
            if (flag) continue;
 
            down_vecs[g].push_back(heap_top.id);
            num++;
        }
    }
 
    // move big(up_vecs) to less
    int ret_val = 0;
    for (int g = 1; g < m_grougs; g++) {
        for (auto up : up_vecs[g]) {
            org_vec[up].groupid = g - 1;
            updataQueue(up);
            ret_val += org_vec[up].point;
        }
    }
 
    for (int g = 0; g < m_grougs - 1; g++) {
        for (auto down : down_vecs[g]) {
            org_vec[down].groupid = g + 1;
            updataQueue(down);
            ret_val += org_vec[down].point;
        }
    }
 
    return ret_val;
}

>> Tuesday, August 1, 2023

[Nguyễn Văn Vang / Nguyen Van Vang] 8/1/2023 10:51
tree set

[Nguyễn Văn Vang / Nguyen Van Vang] 8/1/2023 10:51
#include <iostream>
#include <string>
#include <queue>
#include <vector>
#include <set>

using namespace std;
class Node {
public:
    int id;
    int score;
    Node(int i, int s) {
        id = i;
        score = s;
    }
};
class CmpNode {
public:
    bool operator() (const Node *n1, const Node *n2) {
        if (n2->score != n1->score) return n1->score < n2->score;
        return n1->id < n2->id;
    }
};
int main() {
    set<Node *, CmpNode> p;
    Node n1(1, 22);
    Node n2(2, 33);
    Node n3(3, 77);
    Node n4(4, 77);
    p.insert(&n1);
    p.insert(&n2);
    p.insert(&n3);
    p.insert(&n4);
    
    //p.erase(&n4);
    n4.score = 11;
    //p.insert(&n4);
    for (Node *tp : p) {
        printf("%d %d\n", tp->id, tp->score);
    }
    printf("\n\n");
    /*
    p.erase();
    p.find();
    p.upper_bound();
    p.lower_bound();
    p.begin();
    p.end();
    p.size();
    */
    
    Node n(2, 33);
    auto it = p.upper_bound(&n);
    it--;
    printf("%d_%d\n", (*it)->id, (*it)->score);
    return 0;
}

[Phạm Quang Trà (Tra_광차_Tra) / Pham Quang Tra] 8/1/2023 16:45
#include <iostream>
#include <unordered_map>
#include <set>
using namespace std;
#define maxN 200000000
 
class node
{
public:
    int st;
    int value;
    bool is_empty;
};
 
class cmp
{
public:
    bool operator()(const node *n1,const node *n2)
    {
        if(n1->value != n2->value)return n1->value < n2->value;
        return n1->st < n2->st;
    }
};
unordered_map < int , node *> mymap;
set <node *, cmp> myset;
void init(int N) {
    mymap.clear();
    myset.clear();
    node *newNode = new node();
    newNode->st = 0;
    newNode->value = N;
    newNode->is_empty = true;
 
    myset.insert(newNode);
    return;
}
 
int allocate(int mSize) {
    /*for (node *tp : myset) {
        printf("%d %d\n", tp->st, tp->value);
    }
    printf("\n\n");*/
    //cout<<"them "<<mSize<<" vao vi tri ";
    node *newNode = new node();
    newNode->value = mSize;
    newNode->st= -1;
    //newNode->is_empty = false;
 
    auto it = myset.upper_bound(newNode);
 
     
    if(it!= myset.end()){
    int start = (*it)->st;
    int kc = (*it)->value;
    //cout<<start<<"-\n";
    newNode->st = start;
    newNode->value = mSize;
    mymap[start]= newNode;
    myset.erase(*it);
     
    if(mSize < kc ){
    node *newNod = new node();
    newNod->st = start + mSize;
    newNod->value = kc -mSize;
    myset.insert(newNod);
    }
    return start;
    }
     
    return -1;
}
 
int release(int mAddr) {
     
    auto it = mymap.find(mAddr);
    if(it == mymap.end())return -1;
    int ans = (it->second)->value;
    //cout<<mAddr<<" "<<(it->second)->st<<" "<<ans<<"+\n";
 
    node *newN = new node();
    newN->st = (it->second)->st;
    newN->value = ans;
    mymap.erase(it);
    int dau = newN->st,cuoi = dau + ans - 1;
    node *bef = new node();
    node *aft = new node();
    for (node *tp : myset) {
        if(tp->st< dau && tp->st + tp->value == dau)
        {
            dau = tp->st;
            bef = tp;
        }
        if(tp->st == cuoi+1)
        {
            cuoi = tp->st + tp->value -1;
            aft = tp;
        }
        //printf("%d %d\n", tp->st, tp->value);
    }
 
    newN->st = dau;
    newN->value = cuoi-dau+1;
    myset.erase(bef);
    myset.erase(aft);
    myset.insert(newN);
    
    return ans;
}

>> Wednesday, August 2, 2023

[Nguyễn Văn Vang / Nguyen Van Vang] 8/2/2023 14:44
#include<set>
#include<unordered_map>
 
using namespace std;
 
struct loc
{
    int start;
    int end;
};
 
struct comperator
{
    bool operator()(const struct loc &a, const struct loc &b)
    {
        if ((a.end - a.start) > (b.end - b.start))
        {
            return true;
        }
        else if ((a.end - a.start) == (b.end - b.start) && (a.start < b.start))
        {
            return true;
        }
        else
        {
            return false;
        }
    }
};
 
set<struct loc, struct comperator> alllockers;
set<int> alreadyAssigned;
unordered_map<int, int> locker_to_mid;
int numOfLockers;
int alreadyallocated;
 
int getLockerId(int start, int end)
{
    if (start == 1)
    {
        return start;
    }
    else if (end == numOfLockers)
    {
        return end;
    }
    else
    {
        return (start + (end - start) / 2);
    }
}
 
void init(int N) {
    alreadyallocated = 0;
    numOfLockers = N;
    alllockers.clear();
    alreadyAssigned.clear();
    locker_to_mid.clear();
    alllockers.insert({ 1,numOfLockers });
    alreadyAssigned.insert(0);
    alreadyAssigned.insert(numOfLockers + 1);
    return;
}
 
bool isValidInsertion(int leftIdx, int rightIdx)
{
    if (leftIdx > rightIdx)
    {
        return false;
    }
    return true;
}
 
int arrive(int mId) {
    auto itr = alllockers.begin();
    int lockerId = getLockerId(itr->start,itr->end);
    if (isValidInsertion(itr->start, lockerId - 1))
    {
        alllockers.insert({ itr->start, lockerId - 1 });
    }
    if (isValidInsertion(lockerId + 1, itr->end ))
    {
        alllockers.insert({ lockerId + 1, itr->end });
    }
    alllockers.erase(itr);
    alreadyAssigned.insert(lockerId);
    locker_to_mid[mId] = lockerId;
    return lockerId;
}
 
int leave(int mId) {
    int lockerId = locker_to_mid[mId];
    auto itr = alreadyAssigned.find(lockerId);
    int priviousLoc = *(--itr);
    itr++;
    int nextLoc = *(++itr);
    alllockers.erase({priviousLoc + 1, lockerId - 1});
    alllockers.erase({lockerId + 1, nextLoc - 1});
    if(isValidInsertion(priviousLoc + 1,nextLoc - 1)) {
        alllockers.insert({ priviousLoc + 1,nextLoc - 1 });
    }
    alreadyAssigned.erase(lockerId);
    locker_to_mid.erase(mId);
    return (numOfLockers - alreadyAssigned.size() + 2);
}

[Nguyễn Văn Vang / Nguyen Van Vang] 8/2/2023 14:49
locker

[Nguyễn Văn Vang / Nguyen Van Vang] 8/2/2023 14:52
#include <iostream>
#include <unordered_map>
#include <set>
#include <queue>
#include <vector>
using namespace std;
int N;
int emp;
class node
{
public:
    int st;
    int fi;
    int value;
    bool del;
    node()
    {
        del = false;
    }
};
 
class cmp{
public:
    bool operator()(const node *n1, const node *n2)
    {
        if(n1->value != n2->value) return n1->value < n2->value;
        return n1->st > n2->st;
    }
};
 
class cmp2{
public:
    bool operator()(const node *n1, const node *n2)
    {
        if(n1->st !=n2->st)
        return n1->st < n2->st;
        return n1->fi < n2->fi;
    }
};
 
unordered_map <int , int> mymap;
priority_queue < node*,vector<node *>, cmp> myset;
set <node *, cmp2> myset2;
 
void init(int N) {
    ::N = N;
    emp = N;
    while(!myset.empty())myset.pop();
    mymap.clear();
    myset2.clear();
 
    node *newNode = new node();
    newNode->st = 0;
    newNode->fi = N+1;
    newNode->value = N;
    myset.push(newNode);
    myset2.insert(newNode);
    return;
}
node *x = new node();
int arrive(int mId) {
    emp--;
    node *tp = myset.top();
    myset.pop();
    while(tp->del)
    {
        tp = myset.top();
        myset.pop();
    }
     
    int u = tp->st;
    int v = tp->fi;
    myset2.erase(tp);
    if(u==0)
    {
        mymap[mId]= 1;
        if(tp->fi != 2){
            tp->st++;
            tp->value--;
            myset.push(tp);
            myset2.insert(tp);
        }
        return 1;
    }else if(v== N+1)
    {
        mymap[mId]= N;
        if(tp->st != N-1){
            tp->fi--;
            tp->value--;
            myset.push(tp);
            myset2.insert(tp);
        }
        return N;
    }else
    {
        int mid = (u+v)/2;
        mymap[mId]= mid;
        if(mid - u -1 >0){
            node *newNode = new node();
            newNode->st = tp->st;
            newNode->fi = mid;
            newNode->value = mid - u -1;
            myset.push(newNode);
            myset2.insert(newNode);
        }
 
        if(v - mid - 1 > 0){
            node *newNode = new node();
            newNode->st = mid;
            newNode->fi = v;
            newNode->value = v- mid -1 ;
            myset.push(newNode);
            myset2.insert(newNode);
        }
        return mid;
    }
     
}
 
int leave(int mId) {
    emp++;
    int u = mymap[mId];
    mymap.erase(mId);
    x->st = u;
    x->fi = u;
    auto it = myset2.upper_bound(x);
    node *cur = new node();
    cur->st = u-1;
    cur->fi = u+1;
    
    if(it != myset2.end() && (*it)->st == u)
    {
        cur->fi = (*it)->fi;
        (*it)->del = true;
        myset2.erase(it);
         
    }
     
    it = myset2.upper_bound(x);
    if(it != myset2.begin() )
    {
    it--;
    if((*it)->fi == u)
    {
        cur->st = (*it)->st;
        (*it)->del = true;
        myset2.erase(it);
         
    }
    }
    cur->value = cur->fi - cur->st -1;
    myset.push(cur);
    myset2.insert(cur);
    return emp;
}

[Nguyễn Văn Vang / Nguyen Van Vang] 8/2/2023 14:52
#include <set>
#include <unordered_map>
using namespace std;
 
struct compare_section
{
    bool operator()(pair<int, int> p1, pair<int, int> p2){
        if(p1.second-p1.first == p2.second-p2.first){
            return p1.first < p2.first;
        }
        return p1.second-p1.first > p2.second-p2.first;
    }
};
 
set <pair<int, int>, compare_section> section;
set <int> locker;
unordered_map<int, int> map_id;
int n_total;
int cnt_user;
void init(int N) {
 
    n_total = N;
    section.clear();
    locker.clear();
    map_id.clear();
    section.insert(make_pair(1, N)); //trong tu 1 -> N;
    locker.insert(0);
    locker.insert(N+1);
    return;
}
 
int arrive(int mId) {
     
    auto it = section.begin();
    int st  = it->first;
    int end = it->second;
    if(it->first == 1){
        map_id[mId] = 1;
        section.erase(make_pair(1,end));
        section.insert(make_pair(2, end));
        locker.insert(1);
        return 1;
    }
    else if(it->second == n_total){
        map_id[mId] = n_total;
        section.erase(make_pair(st,n_total));
        section.insert(make_pair(st, n_total - 1));
        locker.insert(n_total);
        return n_total;
    }
    int post_lock = (it->second + it->first) >> 1;
    map_id[mId] = post_lock;
     
    section.insert(make_pair(it->first, post_lock-1));
    section.insert(make_pair(post_lock+1, it->second));
    section.erase(it);
    locker.insert(post_lock);
    return post_lock;
}
 
int leave(int mId) {
    int lock_id = map_id[mId];
    auto it = locker.find(lock_id);
     
    int next_post = *(++it);
    int pre_post  = *(--(--it));
    locker.erase(++it);
    section.erase(make_pair(pre_post  + 1, lock_id - 1));
    section.erase(make_pair(lock_id + 1, next_post - 1));
    section.insert(make_pair(pre_post + 1, next_post - 1));
 
    return n_total - locker.size() + 2;
}

[Phạm Quang Trà (Tra_광차_Tra) / Pham Quang Tra] 8/2/2023 14:55
#include <iostream>
#include <set>
#include <unordered_map>

using namespace std;

const int MAXNODE = 40005;
class Node {
public:
    int start, size;
    void init(int st, int sz) {
        start = st; size = sz;
    }
};

Node pool[MAXNODE];
int cnt;

Node *getNode(int st, int sz) {
    pool[cnt].init(st, sz);
    return (pool + cnt++);
}

class CmpSize {
public:
    bool operator() (const Node *n1, const Node *n2) const {
        if (n1->size != n2->size) return n1->size > n2->size;
        return n1->start < n2->start;
    }
};
class CmpStart {
public:
    bool operator() (const Node *n1, const Node *n2) const {
        return n1->start < n2->start;
    }
};

int N;
unordered_map<int, int> hashLocker;
set<Node *, CmpSize> treeSize;
set<Node *, CmpStart> treeStart;

void init(int N) {
    cnt = 0;
    ::N = N;
    hashLocker.clear();
    treeSize.clear();
    treeStart.clear();
    Node *n = getNode(1, N);
    treeSize.insert(n);
    treeStart.insert(n);
    return;
}

int arrive(int mId) {
    Node *maxSpace = *(treeSize.begin());
    treeSize.erase(maxSpace);
    treeStart.erase(maxSpace);
    if (maxSpace->start == 1) {
        // pick locker at first
        hashLocker[mId] = 1;
        maxSpace->start = 2;
        maxSpace->size--;
        treeSize.insert(maxSpace);
        treeStart.insert(maxSpace);
        return 1;
    } 
    if (maxSpace->start + maxSpace->size - 1 == N) {
        // pick locker at last
        hashLocker[mId] = N;
        maxSpace->size--;
        treeSize.insert(maxSpace);
        treeStart.insert(maxSpace);
        return N;
    } 
    {
        // pick locker at the middle of space
        int indexLocker = maxSpace->start + (maxSpace->size - 1) / 2;
        hashLocker[mId] = indexLocker;
        Node *rightSpace = getNode(indexLocker + 1, maxSpace->start + maxSpace->size - (indexLocker + 1));
        maxSpace->size = indexLocker - maxSpace->start;
        
        if (maxSpace->size > 0) {
            treeSize.insert(maxSpace);
            treeStart.insert(maxSpace);
        }
        if (rightSpace->size > 0) {
            treeSize.insert(rightSpace);
            treeStart.insert(rightSpace);
        }
        return indexLocker;
    }
    return 0;
}

int leave(int mId) {
    int indexLocker = hashLocker[mId];
    hashLocker.erase(mId);
    Node *delNode;
    Node *newNode = getNode(indexLocker, 1);
    Node tp;
    tp.init(indexLocker, 0);
    auto it = treeStart.lower_bound(&tp);
    if (it != treeStart.end()) {
        delNode = (*it);
        if (newNode->start + newNode->size == delNode->start) {
            treeSize.erase(delNode);
            treeStart.erase(delNode);
            newNode->size += delNode->size;
        }
    }

    auto it2 = treeStart.lower_bound(&tp);
    if (it2 != treeStart.begin()) {
        it2--;
        delNode = (*it2);
        if (delNode->start + delNode->size == newNode->start) {
            treeSize.erase(delNode);
            treeStart.erase(delNode);
            newNode->start = delNode->start;
            newNode->size += delNode->size;
        }
    }
    treeSize.insert(newNode);
    treeStart.insert(newNode);
    return N - hashLocker.size();
}

[Nguyễn Văn Vang / Nguyen Van Vang] 8/2/2023 14:56
#include <iostream>
#include <set>
#include <unordered_map>
 
using namespace std;
 
const int MAXNODE = 40005;
class Node {
public:
    int start, size;
    void init(int st, int sz) {
        start = st; size = sz;
    }
};
 
Node pool[MAXNODE];
int cnt;
 
Node *getNode(int st, int sz) {
    pool[cnt].init(st, sz);
    return (pool + cnt++);
}
 
class CmpSize {
public:
    bool operator() (const Node *n1, const Node *n2) const {
        if (n1->size != n2->size) return n1->size > n2->size;
        return n1->start < n2->start;
    }
};
class CmpStart {
public:
    bool operator() (const Node *n1, const Node *n2) const {
        return n1->start < n2->start;
    }
};
 
int N;
unordered_map<int, int> hashLocker;
set<Node *, CmpSize> treeSize;
set<Node *, CmpStart> treeStart;
 
void init(int N) {
    cnt = 0;
    ::N = N;
    hashLocker.clear();
    treeSize.clear();
    treeStart.clear();
    Node *n = getNode(1, N);
    treeSize.insert(n);
    treeStart.insert(n);
    return;
}
 
int arrive(int mId) {
    Node *maxSpace = *(treeSize.begin());
    treeSize.erase(maxSpace);
    treeStart.erase(maxSpace);
    if (maxSpace->start == 1) {
        // pick locker at first
        hashLocker[mId] = 1;
        maxSpace->start = 2;
        maxSpace->size--;
        treeSize.insert(maxSpace);
        treeStart.insert(maxSpace);
        return 1;
    } 
    if (maxSpace->start + maxSpace->size - 1 == N) {
        
        hashLocker[mId] = N;
        maxSpace->size--;
        treeSize.insert(maxSpace);
        treeStart.insert(maxSpace);
        return N;
    } 
    {
       
        int indexLocker = maxSpace->start + (maxSpace->size - 1) / 2;
        hashLocker[mId] = indexLocker;
        Node *rightSpace = getNode(indexLocker + 1, maxSpace->start + maxSpace->size - (indexLocker + 1));
        maxSpace->size = indexLocker - maxSpace->start;
         
        if (maxSpace->size > 0) {
            treeSize.insert(maxSpace);
            treeStart.insert(maxSpace);
        }
        if (rightSpace->size > 0) {
            treeSize.insert(rightSpace);
            treeStart.insert(rightSpace);
        }
        return indexLocker;
    }
    return 0;
}
 
int leave(int mId) {
    int indexLocker = hashLocker[mId];
    hashLocker.erase(mId);
    Node *delNode;
    Node *newNode = getNode(indexLocker, 1);
    Node tp;
    tp.init(indexLocker, 0);
    auto it = treeStart.lower_bound(&tp);
    if (it != treeStart.end()) {
        delNode = (*it);
        if (newNode->start + newNode->size == delNode->start) {
            treeSize.erase(delNode);
            treeStart.erase(delNode);
            newNode->size += delNode->size;
        }
    }
 
    auto it2 = treeStart.lower_bound(&tp);
    if (it2 != treeStart.begin()) {
        it2--;
        delNode = (*it2);
        if (delNode->start + delNode->size == newNode->start) {
            treeSize.erase(delNode);
            treeStart.erase(delNode);
            newNode->start = delNode->start;
            newNode->size += delNode->size;
        }
    }
    treeSize.insert(newNode);
    treeStart.insert(newNode);
    return N - hashLocker.size();
}

[Nguyễn Văn Vang / Nguyen Van Vang] 8/2/2023 14:59
#include <iostream>
#include <set>
#include <unordered_map>
 
using namespace std;
 
const int MAXNODE = 40005;
struct Node {
    int start, size;
    void init(int st, int sz) {
        start = st; size = sz;
    }
};
 
Node pool[MAXNODE];
int cnt;
 
Node *getNode(int st, int sz) {
    pool[cnt].init(st, sz);
    return (pool + cnt++);
}
 
struct CmpSize {
    bool operator() (const Node *n1, const Node *n2) const {
        if (n1->size != n2->size) return n1->size > n2->size;
        return n1->start < n2->start;
    }
};
struct CmpStart {
    bool operator() (const Node *n1, const Node *n2) const {
        return n1->start < n2->start;
    }
};
 
int N;
unordered_map<int, int> hashLocker;
set<Node *, CmpSize> treeSize;
set<Node *, CmpStart> treeStart;
 
void init(int N) {
    cnt = 0;
    ::N = N;
    hashLocker.clear();
    treeSize.clear();
    treeStart.clear();
    Node *n = getNode(1, N);
    treeSize.insert(n);
    treeStart.insert(n);
    return;
}
 
int arrive(int mId) {
    Node *maxSpace = *(treeSize.begin());
    treeSize.erase(maxSpace);
    treeStart.erase(maxSpace);
    if (maxSpace->start == 1) {
        // pick locker at first
        hashLocker[mId] = 1;
        maxSpace->start = 2;
        maxSpace->size--;
        treeSize.insert(maxSpace);
        treeStart.insert(maxSpace);
        return 1;
    } 
    if (maxSpace->start + maxSpace->size - 1 == N) {
        // pick locker at last
        hashLocker[mId] = N;
        maxSpace->size--;
        treeSize.insert(maxSpace);
        treeStart.insert(maxSpace);
        return N;
    } 
    {
       // pick locker at the middle of space
        int indexLocker = maxSpace->start + (maxSpace->size - 1) / 2;
        hashLocker[mId] = indexLocker;
        Node *rightSpace = getNode(indexLocker + 1, maxSpace->start + maxSpace->size - (indexLocker + 1));
        maxSpace->size = indexLocker - maxSpace->start;
         
        if (maxSpace->size > 0) {
            treeSize.insert(maxSpace);
            treeStart.insert(maxSpace);
        }
        if (rightSpace->size > 0) {
            treeSize.insert(rightSpace);
            treeStart.insert(rightSpace);
        }
        return indexLocker;
    }
    return 0;
}
 
int leave(int mId) {
    int indexLocker = hashLocker[mId];
    hashLocker.erase(mId);
    Node *delNode;
    Node *newNode = getNode(indexLocker, 1);
    Node tp;
    tp.init(indexLocker, 0);
    auto it = treeStart.lower_bound(&tp);
    if (it != treeStart.end()) {
        delNode = (*it);
        if (newNode->start + newNode->size == delNode->start) {
            treeSize.erase(delNode);
            treeStart.erase(delNode);
            newNode->size += delNode->size;
        }
    }
 
    auto it2 = treeStart.lower_bound(&tp);
    if (it2 != treeStart.begin()) {
        it2--;
        delNode = (*it2);
        if (delNode->start + delNode->size == newNode->start) {
            treeSize.erase(delNode);
            treeStart.erase(delNode);
            newNode->start = delNode->start;
            newNode->size += delNode->size;
        }
    }
    treeSize.insert(newNode);
    treeStart.insert(newNode);
    return N - hashLocker.size();
}

[Nguyễn Văn Vang / Nguyen Van Vang] 8/2/2023 15:03
servival train

[Nguyễn Văn Vang / Nguyen Van Vang] 8/2/2023 15:03
#include<iostream>
#include<vector>
#include<set>
 
using namespace std;
 
struct passenger
{
    int gId;
    int points;
};
 
passenger PS[100005];
 
vector<int> JOBID[1000];
 
struct cmp
{
    bool operator()(int a, int b) const
    {
        if (PS[a].points == PS[b].points)
            return a < b;
        return PS[a].points > PS[b].points;
    }
};
 
set<int, cmp> GROUPSET[10];       // decreasing order
 
int groupcnt;
int job;
 
void init(int N, int M, int J, int mPoint[], int mJobID[])
{
    groupcnt = N/M;
    job = J;
 
    for (int i = 0; i < N; i++)
    {
        PS[i].gId = i / M;
        PS[i].points = mPoint[i];
 
        JOBID[mJobID[i]].push_back(i);
 
        GROUPSET[i / M].insert(i);
    }
}
 
void destroy()
{
    for (int i = 0; i < groupcnt; i++)
        GROUPSET[i].clear();
 
    for (int i = 0; i < job; i++)
        JOBID[i].clear();
}
 
int update(int mID, int mPoint)
{
    int groupNumber = PS[mID].gId;
 
    GROUPSET[groupNumber].erase(mID);
 
    PS[mID].points += mPoint;
    GROUPSET[groupNumber].insert(mID);
 
    return PS[mID].points;
}
 
int updateByJob(int mJobID, int mPoint)
{
    int sum = 0;
    int size = JOBID[mJobID].size();
 
    // update point for each passenger in that jobid
    for (int i = 0; i < size; i++)
    {
        int id = JOBID[mJobID][i];
 
        sum += update(id, mPoint);
    }
 
    return sum;
}
 
int move(int mNum)
{
    int sum = 0;
    // store temp value
    vector<int> TMP[10];
 
    for (int i = 1; i < groupcnt; i++)
    {
        for (int j = 0; j < mNum; j++)
        {
            // heigh element
            auto itr1 = GROUPSET[i].begin();
             
            // low element
            auto itr2 = --GROUPSET[i - 1].end();
 
            TMP[i - 1].push_back(*itr1);
            TMP[i].push_back(*itr2);
 
            // erase from set
            GROUPSET[i].erase(itr1);
            GROUPSET[i - 1].erase(itr2);
        }
    }
 
    for (int i = 0; i < groupcnt; i++)
    {
        for (int j = 0; j < TMP[i].size(); j++)
        {
            sum += PS[TMP[i][j]].points;
 
            PS[TMP[i][j]].gId = i;
            GROUPSET[i].insert(TMP[i][j]);
        }
    }
 
    return sum;
}

[Phạm Quang Trà (Tra_광차_Tra) / Pham Quang Tra] 8/2/2023 16:41
//soldier
const int MIN_ID = 1;
const int MAX_ID = 100000;
const int MIN_TEAM = 1;
const int MAX_TEAM = 5;
const int MIN_SCORE = 1;
const int MAX_SCORE = 5;
    
struct Node
{
    int id;
    int team;
    Node *prev;
    Node *next;
} soldier[MAX_ID + 1];
    
struct List
{
    Node head;
    Node tail;
    
    static void link(Node *front, Node *back)
    {
        front->next = back;
        back->prev = front;
    }
    
    static void erase(Node *node)
    {
        link(node->prev, node->next);
    }
    
    void initialize()
    {
        link(&head, &tail);
    }
    
    void insert(Node *node)
    {
        link(tail.prev, node);
        link(node, &tail);
    }
    
    bool isEmpty()
    {
        return (head.next == &tail);
    }
    
    void splice(List *list)
    {
        if (list->isEmpty())
            return;
        link(tail.prev, list->head.next);
        link(list->tail.prev, &tail);
        list->initialize();
    }
} soldierGroup[MAX_TEAM + 1][MAX_SCORE + 1];
    
void init()
{
    for (int i = MIN_TEAM; i <= MAX_TEAM; i++)
        for (int j = MIN_SCORE; j <= MAX_SCORE; j++)
            soldierGroup[i][j].initialize();
}
    
void hire(int mID, int mTeam, int mScore)
{
    soldier[mID].id = mID;
    soldier[mID].team = mTeam;
    soldierGroup[mTeam][mScore].insert(soldier + mID);
}
    
void fire(int mID)
{
    List::erase(soldier + mID);
}
    
void updateSoldier(int mID, int mScore)
{
    List::erase(soldier + mID);
    soldierGroup[soldier[mID].team][mScore].insert(soldier + mID);
}
    
void updateTeam(int mTeam, int mChangeScore)
{
    if (mChangeScore > 0)
    {
        for (int i = MAX_SCORE - 1; i >= MIN_SCORE; i--)
        {
            int newScore = i + mChangeScore;
            if (newScore > MAX_SCORE)
                newScore = MAX_SCORE;
            soldierGroup[mTeam][newScore].splice(&soldierGroup[mTeam][i]);
        }
    }
    else if (mChangeScore < 0)
    {
        for (int i = MIN_SCORE + 1; i <= MAX_SCORE; i++)
        {
            int newScore = i + mChangeScore;
            if (newScore < MIN_SCORE)
                newScore = MIN_SCORE;
            soldierGroup[mTeam][newScore].splice(&soldierGroup[mTeam][i]);
        }
    }
}
    
int bestSoldier(int mTeam)
{
    List *maxScoreGroup;
    for (int i = MAX_SCORE; i >= MIN_SCORE; i--)
    {
        if (!soldierGroup[mTeam][i].isEmpty())
        {
            maxScoreGroup = &soldierGroup[mTeam][i];
            break;
        }
    }
    
    int maxId = MIN_ID - 1;
    Node *maxScoreSoldier = maxScoreGroup->head.next;
    while (maxScoreSoldier != &(maxScoreGroup->tail))
    {
        if (maxId < maxScoreSoldier->id)
            maxId = maxScoreSoldier->id;
        maxScoreSoldier = maxScoreSoldier->next;
    }
    return maxId;
}

>> Thursday, August 3, 2023

[Nguyễn Văn Vang / Nguyen Van Vang] 8/3/2023 14:23
#include <iostream>
#include <set>
#include <string>
#include <unordered_map>
#include <algorithm>

using namespace std;
struct node{
    int id;
    int score;
    int  grade;
    int gen;
};
struct cmp{
    bool operator()(const node *n1, const node *n2){
        if(n1->score!=n2->score) return n1->score<n2->score;
        else return n1->id<n2->id;
    }
};

set <node *,cmp> s[4][3];
unordered_map<int,node*> mymap;

void init() {
    mymap.clear();
    for(int i=1;i<4;i++){
        s[i][1].clear();
        s[i][2].clear();
    }
    return;
}

int add(int mId, int mGrade, char mGender[7], int mScore) {
    node *newNode=new node();
    int gender=1;
    if(mGender[0]=='f') gender=2;
    newNode->id=mId;
    newNode->gen=gender;
    newNode->grade=mGrade;
    newNode->score=mScore;
    s[mGrade][gender].insert(newNode);
    auto it=s[mGrade][gender].rbegin();
    mymap[mId]=newNode;
    return (*it)->id;
}

int remove(int mId) {
    auto it=mymap.find(mId);
    if(it==mymap.end()) return 0;
    node *cur=it->second;
    int mGrade = cur->grade;
    int mGender = cur->gen;
    s[mGrade][mGender].erase(cur);
    if(s[mGrade][mGender].empty())return 0;
    auto i = s[mGrade][mGender].begin();
    return (*i)->id;
}

int query(int mGradeCnt, int mGrade[], int mGenderCnt, char mGender[][7], int mScore) {
    int gen[2];
    for(int i=0;i< mGenderCnt;i++)
        {
            gen[i] = 1;
            if(mGender[i][0]=='f')gen[i]=2;
        }
    int ansId =0 , ansScore = 300003;
    node *newNode = new node();
    newNode->score = mScore;
    newNode->id = 0;
    for(int i=0;i<mGradeCnt;i++)
        for(int j=0;j<mGenderCnt;j++)
        {
            int lop = mGrade[i];
            int gt = gen[j];
            auto it = s[lop][gt].upper_bound(newNode);
            if(it != s[lop][gt].end())
            {
                 
                if((*it)->score < ansScore)ansScore = (*it)->score, ansId = (*it)->id;else
                    if((*it)->score == ansScore)if(ansId > (*it)->id)ansId = (*it)->id;
            }
        }
    return ansId;
}

[Nguyễn Văn Vang / Nguyen Van Vang] 8/3/2023 14:24
school record