Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <algorithm>
- #include <queue>
- #include <vector>
- #include <set>
- #include <iostream>
- #include <map>
- #include <iomanip>
- using namespace std;
- #define ll long long
- #define fastio ios::sync_with_stdio(false), cin.tie(0);
- #define pll pair<ll, ll>
- #define pdd pair<double, double>
- #define F first
- #define S second
- #define pb push_back
- #define ppb pop_back
- #define mkp make_pair
- #define sz(a) (ll) a.size()
- #define all(x) x.begin(), x.end()
- #define rep(i, n) for (ll i = 1; i <= n; i++)
- #define lowbit(x) x &(-x)
- ll N;
- // l is 0 r is 1
- struct Node{
- ll x;
- Node *l, *r;
- Node(){x = 0, l = r = NULL;};
- };
- void build(Node *v, ll x, ll level){
- v->x++;
- if(level == -1) return;
- if(x & (1ll << level)){
- if(v->r == NULL) v->r = new Node();
- build(v->r, x, level - 1);
- }
- else{
- if(v->l == NULL) v->l = new Node();
- build(v->l, x, level - 1);
- }
- }
- ll DFS(ll x, Node *v, ll level, ll flag){
- ll rev = 0;
- if(level == -1) return 0ll;
- if(x & (1ll << level)){
- // cerr << (v->r != NULL) << " " << (v->r->x > flag) << endl;
- if(v->r != NULL and v->r->x > flag){
- rev += DFS(x, v->r, level - 1, flag);
- }
- else{
- // cerr << x << " 0 " << level << endl;
- rev += (1ll << level);
- rev += DFS(x, v->l, level - 1, 0);
- }
- }
- else{
- if(v->l != NULL and v->l->x > flag){
- rev += DFS(x, v->l, level - 1, flag);
- }
- else{
- // cerr << x << " 1 " << level << endl;
- rev += (1ll << level);
- rev += DFS(x, v->r, level - 1, 0);
- }
- }
- return rev;
- }
- void solve(){
- cin >> N;
- vector<ll> a;
- ll x;
- ll ans = (1ll << 31);
- for(ll i = 2; i <= N; i++){
- cout << "? " << 1 << " " << i << '\n';
- cout << flush;
- cin >> x;
- a.push_back(x);
- ans = min(ans, x);
- }
- if(N == 2){
- cout << "! " << ans << '\n';
- cout << flush << '\n';
- return;
- }
- Node *root = new Node();
- for(ll i = 0; i < a.size(); ++i){
- build(root, a[i], 30);
- }
- for(ll i = 0; i < a.size(); ++i){
- ll res = DFS(a[i], root, 30, 1);
- ans = min(ans, res);
- }
- cout << "! " << ans << '\n';
- cout << flush << '\n';
- }
- signed main() {
- fastio ll T = 1;
- cin >> T;
- for (ll i = 1; i <= T; i++) {
- solve();
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement