#include <bits/stdc++.h>
using namespace std;
#define fst first
#define snd second
typedef long long ll;
typedef pair<int, int> ii;
const ll LINF = (ll)1e18;
const int INF = (int)1e9;
// multiset<int> t;
// các tính chất tương tự set nhưng có thể lưu các phần tử có giá trị trùng lặp
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
set<int> s; // tập hợp, cây đỏ đen, cây tìm kiếm nhị phân
// thêm xoá trong O(log) (một điểm mạnh vượt trội so với vector (thêm xoá O(n)))
// tính chất:
// + chỉ thao tác trên con trỏ, không thể thao tác trên chỉ số như vector hay mảng bình thường
// + tự động sắp xếp mỗi khi chỉnh sửa (thêm, xoá) (mặc định: tăng dần)
// + các phần tử không được trùng lặp giá trị (set sẽ tự loại bỏ những phần tử trùng lặp)
vector<int> a = {1, 5, 10, 7, 20};
s = set<int>(a.begin(), a.end());
cout << "Cac gia tri co trong s: \n";
for (auto it : s) cout << it << ' '; cout << '\n';
// s = {1, 2, 3, 4, 5};
// >
set<int>::iterator it;
// it = s.find(6); // O(log) // nếu tồn tại giá trị x thì trả về con trỏ trỏ tới x, ngược lại trả về set.end()
// if (it == s.end()) cout << "khong ton tai gia tri trong s" << '\n';
// else cout << *it << '\n';
// lower_bound, upper_bound (>=, > như bên vector)
// int x = 4;
// it = s.lower_bound(x);
// auto it1 = s.upper_bound(x);
// hoàn toàn thao tác trên con trỏ và giá trị, không liên quan gì đến chỉ số cả (một hạn chế so với vector)
// Hai hàm làm nên tên tuổi: insert, erase O(log)
// s.insert(4);
// cout << "s sau khi them gia tri 4\n";
// for (auto it : s) cout << it << ' ';
// cout << '\n';
// it = s.find(4);
// s.erase(it);
// cout << "s sau khi xoa gia tri 4\n";
// for (auto it : s) cout << it << ' ';
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7IAoKI2RlZmluZSBmc3QgZmlyc3QKI2RlZmluZSBzbmQgc2Vjb25kIAoKdHlwZWRlZiBsb25nIGxvbmcgbGw7IAp0eXBlZGVmIHBhaXI8aW50LCBpbnQ+IGlpOyAKCmNvbnN0IGxsIExJTkYgPSAobGwpMWUxODsgCmNvbnN0IGludCBJTkYgPSAoaW50KTFlOTsKCi8vIG11bHRpc2V0PGludD4gdDsgCi8vIGPDoWMgdMOtbmggY2jhuqV0IHTGsMahbmcgdOG7sSBzZXQgbmjGsG5nIGPDsyB0aOG7gyBsxrB1IGPDoWMgcGjhuqduIHThu60gY8OzIGdpw6EgdHLhu4sgdHLDuW5nIGzhurdwCgppbnQgbWFpbigpIHsKCWlvczo6c3luY193aXRoX3N0ZGlvKDApOyAKCWNpbi50aWUoMCk7IAoJc2V0PGludD4gczsgLy8gdOG6rXAgaOG7o3AsIGPDonkgxJHhu48gxJFlbiwgY8OieSB0w6xtIGtp4bq/bSBuaOG7iyBwaMOibgoJLy8gdGjDqm0geG/DoSB0cm9uZyBPKGxvZykgKG3hu5l0IMSRaeG7g20gbeG6oW5oIHbGsOG7o3QgdHLhu5lpIHNvIHbhu5tpIHZlY3RvciAodGjDqm0geG/DoSBPKG4pKSkKCgkvLyB0w61uaCBjaOG6pXQ6IAoJLy8gKyBjaOG7iSB0aGFvIHTDoWMgdHLDqm4gY29uIHRy4buPLCBraMO0bmcgdGjhu4MgdGhhbyB0w6FjIHRyw6puIGNo4buJIHPhu5EgbmjGsCB2ZWN0b3IgaGF5IG3huqNuZyBiw6xuaCB0aMaw4budbmcKCS8vICsgdOG7sSDEkeG7mW5nIHPhuq9wIHjhur9wIG3hu5dpIGtoaSBjaOG7iW5oIHPhu61hICh0aMOqbSwgeG/DoSkgKG3hurdjIMSR4buLbmg6IHTEg25nIGThuqduKQoJLy8gKyBjw6FjIHBo4bqnbiB04butIGtow7RuZyDEkcaw4bujYyB0csO5bmcgbOG6t3AgZ2nDoSB0cuG7iyAoc2V0IHPhur0gdOG7sSBsb+G6oWkgYuG7jyBuaOG7r25nIHBo4bqnbiB04butIHRyw7luZyBs4bq3cCkKCgl2ZWN0b3I8aW50PiBhID0gezEsIDUsIDEwLCA3LCAyMH07IAoJcyA9IHNldDxpbnQ+KGEuYmVnaW4oKSwgYS5lbmQoKSk7IAoKCWNvdXQgPDwgIkNhYyBnaWEgdHJpIGNvIHRyb25nIHM6IFxuIjsgCglmb3IgKGF1dG8gaXQgOiBzKSBjb3V0IDw8IGl0IDw8ICcgJzsgY291dCA8PCAnXG4nOwoKLy8JcyA9IHsxLCAyLCAzLCA0LCA1fTsgCi8vCQkJICAgPgoKCXNldDxpbnQ+OjppdGVyYXRvciBpdDsgCgkvLyBpdCA9IHMuZmluZCg2KTsgLy8gTyhsb2cpIC8vIG7hur91IHThu5NuIHThuqFpIGdpw6EgdHLhu4sgeCB0aMOsIHRy4bqjIHbhu4EgY29uIHRy4buPIHRy4buPIHThu5tpIHgsIG5nxrDhu6NjIGzhuqFpIHRy4bqjIHbhu4Egc2V0LmVuZCgpCgoJLy8gaWYgKGl0ID09IHMuZW5kKCkpIGNvdXQgPDwgImtob25nIHRvbiB0YWkgZ2lhIHRyaSB0cm9uZyBzIiA8PCAnXG4nOwoJLy8gZWxzZSBjb3V0IDw8ICppdCA8PCAnXG4nOwoKCS8vIGxvd2VyX2JvdW5kLCB1cHBlcl9ib3VuZCAoPj0sID4gbmjGsCBiw6puIHZlY3RvcikKCS8vIGludCB4ID0gNDsgICAKCS8vIGl0ID0gcy5sb3dlcl9ib3VuZCh4KTsgCgkvLyBhdXRvIGl0MSA9IHMudXBwZXJfYm91bmQoeCk7IAoKCS8vIGhvw6BuIHRvw6BuIHRoYW8gdMOhYyB0csOqbiBjb24gdHLhu48gdsOgIGdpw6EgdHLhu4ssIGtow7RuZyBsacOqbiBxdWFuIGfDrCDEkeG6v24gY2jhu4kgc+G7kSBj4bqjICht4buZdCBo4bqhbiBjaOG6vyBzbyB24bubaSB2ZWN0b3IpCgkKCS8vIEhhaSBow6BtIGzDoG0gbsOqbiB0w6puIHR14buVaTogaW5zZXJ0LCBlcmFzZSBPKGxvZykKCS8vIHMuaW5zZXJ0KDQpOyAKCS8vIGNvdXQgPDwgInMgc2F1IGtoaSB0aGVtIGdpYSB0cmkgNFxuIjsgCgkvLyBmb3IgKGF1dG8gaXQgOiBzKSBjb3V0IDw8IGl0IDw8ICcgJzsgIAoJLy8gY291dCA8PCAnXG4nOwoKCS8vIGl0ID0gcy5maW5kKDQpOyAgICAKCS8vIHMuZXJhc2UoaXQpOyAKCS8vIGNvdXQgPDwgInMgc2F1IGtoaSB4b2EgZ2lhIHRyaSA0XG4iOyAKCS8vIGZvciAoYXV0byBpdCA6IHMpIGNvdXQgPDwgaXQgPDwgJyAnOyAgIAp9