Select solution language
Write solution here.
## Hướng dẫn
**Nháºn xét:** min(x ⊕ y, y ⊕ z) < x ⊕ z vá»›i (x < y < z).\
Từ nháºn xét trên, hoà n toà n có thể là m được bà i nà y vá»›i CTDL multiset vá»›i thao tác **Thêm**, **Xoá** và **Lấy min**.\
SỠdụng 2 multiset: 1 để lưu dãy số, 1 để lưu min giữa 2 phần tỠliên tiếp.
Code:
```
#include <bits/stdc++.h>
using namespace std;
multiset<int> ms;
multiset<int> ans;
int x,q;
void query1(void)
{
cin >> x;
auto r = ms.lower_bound(x);
if (r != ms.begin())
{
auto l = prev(r);
if (r != ms.end()) ans.erase(ans.find((*l) ^ (*r)));
ans.insert((*l) ^ x);
}
if (r != ms.end()) ans.insert((*r) ^ x);
ms.insert(x);
}
void query2(void)
{
cin >> x;
auto it = ms.find(x);
if (it != ms.begin())
{
auto l = prev(it);
ans.erase(ans.find((*l) ^ x));
}
auto r = next(it);
if (r != ms.end()) ans.erase(ans.find((*r) ^ x));
if (it != ms.begin() && r != ms.end()) ans.insert( (*prev(it)) ^ (*r) );
ms.erase(it);
}
void query3(void)
{
cout << *ans.begin() << '\n';
}
signed main(void)
{
ios_base::sync_with_stdio(false);
cin.tie(nullptr); cout.tie(nullptr);
for (cin >> q; q--;)
{
int opt; cin >> opt;
if (opt == 1) query1();
if (opt == 2) query2();
if (opt == 3) query3();
}
return 0;
}
```