#include <bits/stdc++.h>
using namespace std;
const int N = 300005;
int n, now, s[N], cnt;
pair<int, int> e[N];
vector<pair<int, int> > q;
int ask(int x, int y) {
  printf("? %d %d\n", x, y);
  fflush(stdout);
  scanf("%d", &x);
  return x;
}
void ins(int x, int y) { e[++cnt] = pair<int, int>(x, y); }
void inv(int x, int y) {
  for (int i = (x); i <= (y); i++)
    if (s[i] != -1) s[i] ^= 1;
}
int main() {
  srand(time(NULL));
  scanf("%d%d", &n, &now);
  if (n == 1) {
    printf("! %d\n", now);
    fflush(stdout);
    exit(0);
  }
  for (int i = (1); i <= (n); i++)
    for (int j = (i); j <= (n); j++)
      if (i + n - j + 1 & 1) q.push_back(pair<int, int>(i, j));
  memset(s, -1, sizeof(s));
  for (int i = (1); i <= (n - 1); i++)
    while (s[i] == -1) {
      int x = rand() % n + 1;
      if (x > i) {
        int l = i + 1, r = x, t;
        if (l + n - r & 1) continue;
        assert(l <= r);
        t = ask(l, r);
        if ((t ^ now ^ r) & 1) {
          ins(l, n), inv(l, n);
          s[i] = t - now + n - i >> 1;
          s[i] = t - s[i];
          for (int j = (1); j <= (i - 1); j++) s[i] -= s[j];
          now = t;
          break;
        } else
          ins(1, r), inv(1, r), now = t;
      } else {
        int l = x, r = i, t;
        if (l + n - r & 1) continue;
        t = ask(l, r);
        if ((t ^ now ^ r) & 1)
          ins(l, n), inv(l, n), now = t;
        else {
          ins(1, r), inv(1, r);
          s[i] = t - now + r >> 1;
          for (int j = (1); j <= (i - 1); j++) s[i] -= s[j];
          now = t;
          break;
        }
      }
    }
  s[n] = now;
  for (int i = (1); i <= (n - 1); i++) s[n] -= s[i];
  for (int i = (1); i <= (cnt); i++) inv(e[i].first, e[i].second);
  printf("! ");
  for (int i = (1); i <= (n); i++) printf("%d", s[i]);
  fflush(stdout);
  return 0;
}
