#include <bits/stdc++.h>   using namespace std;   int n, k, a[303], flipped[303];   int query(int l, int r) {     cout <<  ?   << l <<     << r << endl;     cin >> l;     fflush(stdin);     return l;   }   void flip(int l, int r) {     for (int i = l; i < r + 1; i++) {       flipped[i] ^= 1;     }   }   void sol(int l, int r, int segk, bool f) {     if (l > r) return;     int lc = 0, rc = 0;     for (int i = 1; i < l; i++) lc += a[i] ^ flipped[i];     for (int i = r + 1; i < n + 1; i++) rc += a[i] ^ flipped[i];     if (l == r)       a[l] = flipped[l] ^ segk;     else if (f) {       while (1) {         int q = query(l, r - 1);         if (lc + n - r - rc + r - l + 1 - segk == q) {           segk = r - l + 1 - segk;           rc = n - r - rc;           flip(l, n);         } else {           int g = (q + 1 + lc + segk - r - rc) / 2;           a[r] = flipped[r] ^ g;           lc = l - 1 - lc;           segk = r - l - segk + 2 * g;           flip(1, r - 1);           sol(l, r, segk, !f);           return;         }       }     } else {       while (1) {         int q = query(l + 1, r);         if (l - 1 - lc + rc + r - l + 1 - segk == q) {           segk = r - l + 1 - segk;           lc = l - 1 - lc;           flip(1, r);         } else {           int g = (q + rc + l + segk - n - lc) / 2;           a[l] = flipped[l] ^ g;           rc = n - r - rc;           segk = r - l - segk + g;           flip(l + 1, n);           sol(l + 1, r - 1, segk - (a[r] ^ flipped[r]), !f);           return;         }       }     }   }   void disp() {     cout <<  !  ;     for (int i = 1; i < n + 1; i++) cout << a[i];     cout << endl;   }   void solve() {     cin >> n >> k;     sol(1, n, k, 1);     disp();   }   signed main() {     int t = 1;     while (t--) {       solve();     }     return 0;   }   