#include <bits/stdc++.h>
using namespace std;
//using lint = long long;

struct P
{
    int x,y;

    bool operator<(const P &a)const{
        if(x!=a.x)
              return x>a.x;
        return y>a.y;
    }

};

vector<int> v;

//bitset<4001000> b;
int i,n,d,m,k,a,b,c,h;

int o[311];
int l[311];
int j[1];
int e;

//int dx[10]={2,2,-2,-2,1,1,-1,-1},dy[10]={1,-1,1,-1,2,-2,2,-2};

int dx[10]={0,1,0,-1,1,1,-1,-1},dy[10]={1,0,-1,0,1,-1,1,-1},dz[10]={0,0,0,0,1,-1};
long long mod=998244353,mod2=1000000009,mod3=2017;
long long x,z,y;
double pi=3.14159265;
P u[3];
stack<int> s;
//set<int> s[222][22];
//priority_queue<P> q;
queue<int> q;
//2147483647
//'1'==49;
//'A'==65;
//'a'==97;
//unordered_
//map<int,int> p;
/*
struct custom_hash {
    static uint64_t splitmix64(uint64_t x) {
        // http://xorshift.di.unimi.it/splitmix64.c
        x += 0x9e3779b97f4a7c15;
        x = (x ^ (x >> 30)) * 0xbf58476d1ce4e5b9;
        x = (x ^ (x >> 27)) * 0x94d049bb133111eb;
        return x ^ (x >> 31);
    }

    size_t operator()(uint64_t x) const {
        static const uint64_t FIXED_RANDOM = chrono::steady_clock::now().time_since_epoch().count();
        return splitmix64(x + FIXED_RANDOM);
    }
};
unordered_map<long long, int, custom_hash> safe_map;
*/
//list<int> l;

string r;
//char r[222253];
//deque<int> de;
//srand((int)time(NULL));
/*bool as(P a,P b)
{
    if(a.x!=b.x)
    return a.x<b.x;
    return a.y<b.y;
}*/

bool as(P a,P b)
{
    if(a.x!=b.x)
        return a.x<b.x;
    return a.y<b.y;
}

int f(int n,int m)
{
    printf("? %d %d\n",n,m);
    fflush(stdout);
    int p;
    scanf("%d",&p);
    return p;
}

void g1()
{
    n=b;
    for(int t=1;t<=a;t++)
    {
        for(;(c=f(t,t))&&(((n-c)%2+2)%2!=t%2);)
        {
            for(int w=t;w<=a;l[w]++,w++);
            n=c;
        }
        int x=n,y=c;
        for(int w=1;w<t;w++)
            if((l[w]+o[w])%2) x--;
            else y--;
        if((x>y&&l[t]%2==0)||(x<y&&l[t]%2)) o[t]=1;
        for(int w=1;w<=t;w++)
            l[w]++;
        n=c;
    }
}

void g2()
{
    /*n=b;
    for(int t=1;t<a;t++)
    {
        c=f(t,t+1);
        m=((n-c)%2+2)%2;
        if(m%2==t%2)
        {
            int x=0,y=0;
            for(int w=1;w<t;w++)
            {
                if((o[w]+l[w])%2) x++;
                else y++;
            }
            if((x-y<n-c&&(l[t])%2==0)||(x-y>n-c&&l[t]%2))
            {
                //printf("%d %d %d %d %d\n",x,y,n,c,t);
                o[t]=1;
            }
            for(int w=1;w<=t;w++)
                l[w]++;
        }
        else
        {
            //puts("#");
            int x=(n+c-(a-t))/2;
            for(int w=1;w<t;w++)
                if((o[w]+l[w])%2) x--;
            if((x&&l[t]%2==0)||(x==0&&l[t]%2)) o[t]=1;

            for(int w=t+1;w<=a;w++)
                l[w]++;

        }

        n=c;
    }

    for(int t=1;t<a;t++)
        d+=o[t];

    if(d==b) o[a]=0;
    else o[a]=1;*/

    puts("! 1");
    fflush(stdout);

    n=b;
    for(int t=1;t<a;t++)
    {
        for(;(c=f(t,t+1))&&(((n-c)%2+2)%2!=t%2);)
        {
            for(int w=t+1;w<=a;l[w]++,w++);
            n=c;
        }
        int x=n,y=c;
        for(int w=1;w<t;w++)
            if((l[w]+o[w])%2) x--;
            else y--;
        if(((x==y+1)&&(l[t]%2==0))||((x+1==y)&&(l[t]%2))) o[t]=1;
        for(int w=1;w<=t;w++)
            l[w]++;
        n=c;
    }
    int x=0;
    for(int t=1;t<a;t++) x+=o[t];
    if(x<b) o[a]=1;
}

int main()
{
    scanf("%d %d",&a,&b);
    if(a%2) g2();
    else g1();
    printf("! ");
    for(int t=1;t<=a;t++)
        printf("%d",o[t]);
    puts("");
    fflush(stdout);
}


#include <bits/stdc++.h>
using namespace std;
//using lint = long long;

struct P
{
    int x,y;

    bool operator<(const P &a)const{
        if(x!=a.x)
              return x>a.x;
        return y>a.y;
    }

};

vector<int> v;

//bitset<4001000> b;
int i,n,d,m,k,a,b,c,h;

int o[311];
int l[311];
int j[1];
int e;

//int dx[10]={2,2,-2,-2,1,1,-1,-1},dy[10]={1,-1,1,-1,2,-2,2,-2};

int dx[10]={0,1,0,-1,1,1,-1,-1},dy[10]={1,0,-1,0,1,-1,1,-1},dz[10]={0,0,0,0,1,-1};
long long mod=998244353,mod2=1000000009,mod3=2017;
long long x,z,y;
double pi=3.14159265;
P u[3];
stack<int> s;
//set<int> s[222][22];
//priority_queue<P> q;
queue<int> q;
//2147483647
//'1'==49;
//'A'==65;
//'a'==97;
//unordered_
//map<int,int> p;
/*
struct custom_hash {
    static uint64_t splitmix64(uint64_t x) {
        // http://xorshift.di.unimi.it/splitmix64.c
        x += 0x9e3779b97f4a7c15;
        x = (x ^ (x >> 30)) * 0xbf58476d1ce4e5b9;
        x = (x ^ (x >> 27)) * 0x94d049bb133111eb;
        return x ^ (x >> 31);
    }

    size_t operator()(uint64_t x) const {
        static const uint64_t FIXED_RANDOM = chrono::steady_clock::now().time_since_epoch().count();
        return splitmix64(x + FIXED_RANDOM);
    }
};
unordered_map<long long, int, custom_hash> safe_map;
*/
//list<int> l;

string r;
//char r[222253];
//deque<int> de;
//srand((int)time(NULL));
/*bool as(P a,P b)
{
    if(a.x!=b.x)
    return a.x<b.x;
    return a.y<b.y;
}*/

bool as(P a,P b)
{
    if(a.x!=b.x)
        return a.x<b.x;
    return a.y<b.y;
}

int f(int n,int m)
{
    printf("? %d %d\n",n,m);
    fflush(stdout);
    int p;
    scanf("%d",&p);
    return p;
}

void g1()
{
    n=b;
    for(int t=1;t<=a;t++)
    {
        for(;(c=f(t,t))&&(((n-c)%2+2)%2!=t%2);)
        {
            for(int w=t;w<=a;l[w]++,w++);
            n=c;
        }
        int x=n,y=c;
        for(int w=1;w<t;w++)
            if((l[w]+o[w])%2) x--;
            else y--;
        if((x>y&&l[t]%2==0)||(x<y&&l[t]%2)) o[t]=1;
        for(int w=1;w<=t;w++)
            l[w]++;
        n=c;
    }
}

void g2()
{
    /*n=b;
    for(int t=1;t<a;t++)
    {
        c=f(t,t+1);
        m=((n-c)%2+2)%2;
        if(m%2==t%2)
        {
            int x=0,y=0;
            for(int w=1;w<t;w++)
            {
                if((o[w]+l[w])%2) x++;
                else y++;
            }
            if((x-y<n-c&&(l[t])%2==0)||(x-y>n-c&&l[t]%2))
            {
                //printf("%d %d %d %d %d\n",x,y,n,c,t);
                o[t]=1;
            }
            for(int w=1;w<=t;w++)
                l[w]++;
        }
        else
        {
            //puts("#");
            int x=(n+c-(a-t))/2;
            for(int w=1;w<t;w++)
                if((o[w]+l[w])%2) x--;
            if((x&&l[t]%2==0)||(x==0&&l[t]%2)) o[t]=1;

            for(int w=t+1;w<=a;w++)
                l[w]++;

        }

        n=c;
    }

    for(int t=1;t<a;t++)
        d+=o[t];

    if(d==b) o[a]=0;
    else o[a]=1;*/

    return;

    n=b;
    for(int t=1;t<a;t++)
    {
        for(;(c=f(t,t+1))&&(((n-c)%2+2)%2!=t%2);)
        {
            for(int w=t+1;w<=a;l[w]++,w++);
            n=c;
        }
        int x=n,y=c;
        for(int w=1;w<t;w++)
            if((l[w]+o[w])%2) x--;
            else y--;
        if(((x==y+1)&&(l[t]%2==0))||((x+1==y)&&(l[t]%2))) o[t]=1;
        for(int w=1;w<=t;w++)
            l[w]++;
        n=c;
    }
    int x=0;
    for(int t=1;t<a;t++) x+=o[t];
    if(x<b) o[a]=1;
}

int main()
{
    scanf("%d %d",&a,&b);
    if(a%2) g2();
    else g1();
    printf("! ");
    for(int t=1;t<=a;t++)
        printf("%d",o[t]);
    puts("");
    fflush(stdout);
}


#include <bits/stdc++.h>
using namespace std;
//using lint = long long;

struct P
{
    int x,y;

    bool operator<(const P &a)const{
        if(x!=a.x)
              return x>a.x;
        return y>a.y;
    }

};

vector<int> v;

//bitset<4001000> b;
int i,n,d,m,k,a,b,c,h;

int o[311];
int l[311];
int j[1];
int e;

//int dx[10]={2,2,-2,-2,1,1,-1,-1},dy[10]={1,-1,1,-1,2,-2,2,-2};

int dx[10]={0,1,0,-1,1,1,-1,-1},dy[10]={1,0,-1,0,1,-1,1,-1},dz[10]={0,0,0,0,1,-1};
long long mod=998244353,mod2=1000000009,mod3=2017;
long long x,z,y;
double pi=3.14159265;
P u[3];
stack<int> s;
//set<int> s[222][22];
//priority_queue<P> q;
queue<int> q;
//2147483647
//'1'==49;
//'A'==65;
//'a'==97;
//unordered_
//map<int,int> p;
/*
struct custom_hash {
    static uint64_t splitmix64(uint64_t x) {
        // http://xorshift.di.unimi.it/splitmix64.c
        x += 0x9e3779b97f4a7c15;
        x = (x ^ (x >> 30)) * 0xbf58476d1ce4e5b9;
        x = (x ^ (x >> 27)) * 0x94d049bb133111eb;
        return x ^ (x >> 31);
    }

    size_t operator()(uint64_t x) const {
        static const uint64_t FIXED_RANDOM = chrono::steady_clock::now().time_since_epoch().count();
        return splitmix64(x + FIXED_RANDOM);
    }
};
unordered_map<long long, int, custom_hash> safe_map;
*/
//list<int> l;

string r;
//char r[222253];
//deque<int> de;
//srand((int)time(NULL));
/*bool as(P a,P b)
{
    if(a.x!=b.x)
    return a.x<b.x;
    return a.y<b.y;
}*/

bool as(P a,P b)
{
    if(a.x!=b.x)
        return a.x<b.x;
    return a.y<b.y;
}

int f(int n,int m)
{
    printf("? %d %d\n",n,m);
    fflush(stdout);
    int p;
    scanf("%d",&p);
    return p;
}

void g1()
{
    n=b;
    for(int t=1;t<=a;t++)
    {
        for(;c=f(t,t),((n-c)%2+2)%2!=t%2;)
        {
            for(int w=t;w<=a;l[w]++,w++);
            n=c;
        }
        int x=n,y=c;
        for(int w=1;w<t;w++)
            if((l[w]+o[w])%2) x--;
            else y--;
        if((x>y&&l[t]%2==0)||(x<y&&l[t]%2)) o[t]=1;
        for(int w=1;w<=t;w++)
            l[w]++;
        n=c;
    }
}

void g2()
{
    n=b;
    for(int t=1;t<a;t++)
    {
        c=f(t,t+1);
        m=((n-c)%2+2)%2;
        if(m%2==t%2)
        {
            int x=0,y=0;
            for(int w=1;w<t;w++)
            {
                if((o[w]+l[w])%2) x++;
                else y++;
            }
            if((x-y<n-c&&(l[t])%2==0)||(x-y>n-c&&l[t]%2))
            {
                //printf("%d %d %d %d %d\n",x,y,n,c,t);
                o[t]=1;
            }
            for(int w=1;w<=t;w++)
                l[w]++;
        }
        else
        {
            //puts("#");
            int x=(n+c-(a-t))/2;
            for(int w=1;w<t;w++)
                if((o[w]+l[w])%2) x--;
            if((x&&l[t]%2==0)||(x==0&&l[t]%2)) o[t]=1;

            for(int w=t+1;w<=a;w++)
                l[w]++;

        }

        n=c;
    }

    for(int t=1;t<a;t++)
        d+=o[t];

    if(d==b) o[a]=0;
    else o[a]=1;
}

int main()
{
    scanf("%d %d",&a,&b);
    if(a%2) g2();
    else g1();
    printf("! ");
    for(int t=1;t<=a;t++)
        printf("%d",o[t]);
    puts("");
    fflush(stdout);
}


#include <bits/stdc++.h>
using namespace std;
//using lint = long long;

struct P
{
    int x,y;

    bool operator<(const P &a)const{
        if(x!=a.x)
              return x>a.x;
        return y>a.y;
    }

};

vector<int> v;

//bitset<4001000> b;
int i,n,d,m,k,a,b,c,h;

int o[311];
int l[311];
int j[1];
int e;

//int dx[10]={2,2,-2,-2,1,1,-1,-1},dy[10]={1,-1,1,-1,2,-2,2,-2};

int dx[10]={0,1,0,-1,1,1,-1,-1},dy[10]={1,0,-1,0,1,-1,1,-1},dz[10]={0,0,0,0,1,-1};
long long mod=998244353,mod2=1000000009,mod3=2017;
long long x,z,y;
double pi=3.14159265;
P u[3];
stack<int> s;
//set<int> s[222][22];
//priority_queue<P> q;
queue<int> q;
//2147483647
//'1'==49;
//'A'==65;
//'a'==97;
//unordered_
//map<int,int> p;
/*
struct custom_hash {
    static uint64_t splitmix64(uint64_t x) {
        // http://xorshift.di.unimi.it/splitmix64.c
        x += 0x9e3779b97f4a7c15;
        x = (x ^ (x >> 30)) * 0xbf58476d1ce4e5b9;
        x = (x ^ (x >> 27)) * 0x94d049bb133111eb;
        return x ^ (x >> 31);
    }

    size_t operator()(uint64_t x) const {
        static const uint64_t FIXED_RANDOM = chrono::steady_clock::now().time_since_epoch().count();
        return splitmix64(x + FIXED_RANDOM);
    }
};
unordered_map<long long, int, custom_hash> safe_map;
*/
//list<int> l;

string r;
//char r[222253];
//deque<int> de;
//srand((int)time(NULL));
/*bool as(P a,P b)
{
    if(a.x!=b.x)
    return a.x<b.x;
    return a.y<b.y;
}*/

bool as(P a,P b)
{
    if(a.x!=b.x)
        return a.x<b.x;
    return a.y<b.y;
}

int f(int n,int m)
{
    printf("? %d %d\n",n,m);
    fflush(stdout);
    int p;
    scanf("%d",&p);
    return p;
}

void g1()
{
    n=b;
    for(int t=1;t<=a;t++)
    {
        for(;c=f(t,t),((n-c)%2+2)%2!=t%2;)
        {
            for(int w=t;w<=a;l[w]++,w++);
            n=c;
        }
        int x=n,y=c;
        for(int w=1;w<t;w++)
            if((l[w]+o[w])%2) x--;
            else y--;
        if((x>y&&l[t]%2==0)||(x<y&&l[t]%2)) o[t]=1;
        for(int w=1;w<=t;w++)
            l[w]++;
        n=c;
    }
}

void g2()
{
    /*n=b;
    for(int t=1;t<a;t++)
    {
        c=f(t,t+1);
        m=((n-c)%2+2)%2;
        if(m%2==t%2)
        {
            int x=0,y=0;
            for(int w=1;w<t;w++)
            {
                if((o[w]+l[w])%2) x++;
                else y++;
            }
            if((x-y<n-c&&(l[t])%2==0)||(x-y>n-c&&l[t]%2))
            {
                //printf("%d %d %d %d %d\n",x,y,n,c,t);
                o[t]=1;
            }
            for(int w=1;w<=t;w++)
                l[w]++;
        }
        else
        {
            //puts("#");
            int x=(n+c-(a-t))/2;
            for(int w=1;w<t;w++)
                if((o[w]+l[w])%2) x--;
            if((x&&l[t]%2==0)||(x==0&&l[t]%2)) o[t]=1;

            for(int w=t+1;w<=a;w++)
                l[w]++;

        }

        n=c;
    }

    for(int t=1;t<a;t++)
        d+=o[t];

    if(d==b) o[a]=0;
    else o[a]=1;*/

    n=b;
    for(int t=1;t<a;t++)
    {
        for(;c=f(t,t+1),((n-c)%2+2)%2!=t%2;)
        {
            for(int w=t+1;w<=a;l[w]++,w++);
            n=c;
        }
        int x=n,y=c;
        for(int w=1;w<t;w++)
            if((l[w]+o[w])%2) x--;
            else y--;
        if((x>y&&l[t]%2==0)||(x<y&&l[t]%2)) o[t]=1;
        for(int w=1;w<=t;w++)
            l[w]++;
        n=c;
    }
    int x=0;
    for(int t=1;t<a;t++) x+=o[t];
    if(x==b) o[a]=1;
}

int main()
{
    scanf("%d %d",&a,&b);
    if(a%2) g2();
    else g1();
    printf("! ");
    for(int t=1;t<=a;t++)
        printf("%d",o[t]);
    puts("");
    fflush(stdout);
}


#include <bits/stdc++.h>
using namespace std;
//using lint = long long;

struct P
{
    int x,y;

    bool operator<(const P &a)const{
        if(x!=a.x)
              return x>a.x;
        return y>a.y;
    }

};

vector<int> v;

//bitset<4001000> b;
int i,n,d,m,k,a,b,c,h;

int o[311];
int l[311];
int j[1];
int e;

//int dx[10]={2,2,-2,-2,1,1,-1,-1},dy[10]={1,-1,1,-1,2,-2,2,-2};

int dx[10]={0,1,0,-1,1,1,-1,-1},dy[10]={1,0,-1,0,1,-1,1,-1},dz[10]={0,0,0,0,1,-1};
long long mod=998244353,mod2=1000000009,mod3=2017;
long long x,z,y;
double pi=3.14159265;
P u[3];
stack<int> s;
//set<int> s[222][22];
//priority_queue<P> q;
queue<int> q;
//2147483647
//'1'==49;
//'A'==65;
//'a'==97;
//unordered_
//map<int,int> p;
/*
struct custom_hash {
    static uint64_t splitmix64(uint64_t x) {
        // http://xorshift.di.unimi.it/splitmix64.c
        x += 0x9e3779b97f4a7c15;
        x = (x ^ (x >> 30)) * 0xbf58476d1ce4e5b9;
        x = (x ^ (x >> 27)) * 0x94d049bb133111eb;
        return x ^ (x >> 31);
    }

    size_t operator()(uint64_t x) const {
        static const uint64_t FIXED_RANDOM = chrono::steady_clock::now().time_since_epoch().count();
        return splitmix64(x + FIXED_RANDOM);
    }
};
unordered_map<long long, int, custom_hash> safe_map;
*/
//list<int> l;

string r;
//char r[222253];
//deque<int> de;
//srand((int)time(NULL));
/*bool as(P a,P b)
{
    if(a.x!=b.x)
    return a.x<b.x;
    return a.y<b.y;
}*/

bool as(P a,P b)
{
    if(a.x!=b.x)
        return a.x<b.x;
    return a.y<b.y;
}

int f(int n,int m)
{
    printf("? %d %d\n",n,m);
    fflush(stdout);
    int p;
    scanf("%d",&p);
    return p;
}

void g1()
{
    n=b;
    for(int t=1;t<=a;t++)
    {
        for(;(c=f(t,t))&&((n-c)%2+2)%2!=t%2;)
        {
            for(int w=t;w<=a;l[w]++,w++);
            n=c;
        }
        int x=n,y=c;
        for(int w=1;w<t;w++)
            if((l[w]+o[w])%2) x--;
            else y--;
        if((x>y&&l[t]%2==0)||(x<y&&l[t]%2)) o[t]=1;
        for(int w=1;w<=t;w++)
            l[w]++;
        n=c;
    }
}

void g2()
{
    /*n=b;
    for(int t=1;t<a;t++)
    {
        c=f(t,t+1);
        m=((n-c)%2+2)%2;
        if(m%2==t%2)
        {
            int x=0,y=0;
            for(int w=1;w<t;w++)
            {
                if((o[w]+l[w])%2) x++;
                else y++;
            }
            if((x-y<n-c&&(l[t])%2==0)||(x-y>n-c&&l[t]%2))
            {
                //printf("%d %d %d %d %d\n",x,y,n,c,t);
                o[t]=1;
            }
            for(int w=1;w<=t;w++)
                l[w]++;
        }
        else
        {
            //puts("#");
            int x=(n+c-(a-t))/2;
            for(int w=1;w<t;w++)
                if((o[w]+l[w])%2) x--;
            if((x&&l[t]%2==0)||(x==0&&l[t]%2)) o[t]=1;

            for(int w=t+1;w<=a;w++)
                l[w]++;

        }

        n=c;
    }

    for(int t=1;t<a;t++)
        d+=o[t];

    if(d==b) o[a]=0;
    else o[a]=1;*/

    n=b;
    for(int t=1;t<a;t++)
    {
        for(;(c=f(t,t+1))&&((n-c)%2+2)%2!=t%2;)
        {
            for(int w=t+1;w<=a;l[w]++,w++);
            n=c;
        }
        int x=n,y=c;
        for(int w=1;w<t;w++)
            if((l[w]+o[w])%2) x--;
            else y--;
        if((x>y&&l[t]%2==0)||(x<y&&l[t]%2)) o[t]=1;
        for(int w=1;w<=t;w++)
            l[w]++;
        n=c;
    }
    int x=0;
    for(int t=1;t<a;t++) x+=o[t];
    if(x<b) o[a]=1;
}

int main()
{
    scanf("%d %d",&a,&b);
    if(a%2) g2();
    else g1();
    printf("! ");
    for(int t=1;t<=a;t++)
        printf("%d",o[t]);
    puts("");
    fflush(stdout);
}


#include <bits/stdc++.h>
using namespace std;
//using lint = long long;

struct P
{
    int x,y;

    bool operator<(const P &a)const{
        if(x!=a.x)
              return x>a.x;
        return y>a.y;
    }

};

vector<int> v;

//bitset<4001000> b;
int i,n,d,m,k,a,b,c,h;

int o[311];
int l[311];
int j[1];
int e;

//int dx[10]={2,2,-2,-2,1,1,-1,-1},dy[10]={1,-1,1,-1,2,-2,2,-2};

int dx[10]={0,1,0,-1,1,1,-1,-1},dy[10]={1,0,-1,0,1,-1,1,-1},dz[10]={0,0,0,0,1,-1};
long long mod=998244353,mod2=1000000009,mod3=2017;
long long x,z,y;
double pi=3.14159265;
P u[3];
stack<int> s;
//set<int> s[222][22];
//priority_queue<P> q;
queue<int> q;
//2147483647
//'1'==49;
//'A'==65;
//'a'==97;
//unordered_
//map<int,int> p;
/*
struct custom_hash {
    static uint64_t splitmix64(uint64_t x) {
        // http://xorshift.di.unimi.it/splitmix64.c
        x += 0x9e3779b97f4a7c15;
        x = (x ^ (x >> 30)) * 0xbf58476d1ce4e5b9;
        x = (x ^ (x >> 27)) * 0x94d049bb133111eb;
        return x ^ (x >> 31);
    }

    size_t operator()(uint64_t x) const {
        static const uint64_t FIXED_RANDOM = chrono::steady_clock::now().time_since_epoch().count();
        return splitmix64(x + FIXED_RANDOM);
    }
};
unordered_map<long long, int, custom_hash> safe_map;
*/
//list<int> l;

string r;
//char r[222253];
//deque<int> de;
//srand((int)time(NULL));
/*bool as(P a,P b)
{
    if(a.x!=b.x)
    return a.x<b.x;
    return a.y<b.y;
}*/

bool as(P a,P b)
{
    if(a.x!=b.x)
        return a.x<b.x;
    return a.y<b.y;
}

int f(int n,int m)
{
    printf("? %d %d\n",n,m);
    fflush(stdout);
    int p;
    scanf("%d",&p);
    return p;
}

void g1()
{
    n=b;
    for(int t=1;t<=a;t++)
    {
        for(;(c=f(t,t))&&(((n-c)%2+2)%2!=t%2);)
        {
            for(int w=t;w<=a;l[w]++,w++);
            n=c;
        }
        int x=n,y=c;
        for(int w=1;w<t;w++)
            if((l[w]+o[w])%2) x--;
            else y--;
        if((x>y&&l[t]%2==0)||(x<y&&l[t]%2)) o[t]=1;
        for(int w=1;w<=t;w++)
            l[w]++;
        n=c;
    }
}

void g2()
{
    /*n=b;
    for(int t=1;t<a;t++)
    {
        c=f(t,t+1);
        m=((n-c)%2+2)%2;
        if(m%2==t%2)
        {
            int x=0,y=0;
            for(int w=1;w<t;w++)
            {
                if((o[w]+l[w])%2) x++;
                else y++;
            }
            if((x-y<n-c&&(l[t])%2==0)||(x-y>n-c&&l[t]%2))
            {
                //printf("%d %d %d %d %d\n",x,y,n,c,t);
                o[t]=1;
            }
            for(int w=1;w<=t;w++)
                l[w]++;
        }
        else
        {
            //puts("#");
            int x=(n+c-(a-t))/2;
            for(int w=1;w<t;w++)
                if((o[w]+l[w])%2) x--;
            if((x&&l[t]%2==0)||(x==0&&l[t]%2)) o[t]=1;

            for(int w=t+1;w<=a;w++)
                l[w]++;

        }

        n=c;
    }

    for(int t=1;t<a;t++)
        d+=o[t];

    if(d==b) o[a]=0;
    else o[a]=1;*/

    n=b;
    for(int t=1;t<a;t++)
    {
        for(;(c=f(t,t+1))&&(((n-c)%2+2)%2!=t%2);)
        {
            for(int w=t+1;w<=a;l[w]++,w++);
            n=c;
        }
        int x=n,y=c;
        for(int w=1;w<t;w++)
            if((l[w]+o[w])%2) x--;
            else y--;
        if((x>y&&l[t]%2==0)||(x<y&&l[t]%2)) o[t]=1;
        for(int w=1;w<=t;w++)
            l[w]++;
        n=c;
    }
    int x=0;
    for(int t=1;t<a;t++) x+=o[t];
    if(x<b) o[a]=1;
}

int main()
{
    scanf("%d %d",&a,&b);
    if(a%2) g2();
    else g1();
    printf("! ");
    for(int t=1;t<=a;t++)
        printf("%d",o[t]);
    puts("");
    fflush(stdout);
}


#include <bits/stdc++.h>
using namespace std;
//using lint = long long;

struct P
{
    int x,y;

    bool operator<(const P &a)const{
        if(x!=a.x)
              return x>a.x;
        return y>a.y;
    }

};

vector<int> v;

//bitset<4001000> b;
int i,n,d,m,k,a,b,c,h;

int o[311];
int l[311];
int j[1];
int e;

//int dx[10]={2,2,-2,-2,1,1,-1,-1},dy[10]={1,-1,1,-1,2,-2,2,-2};

int dx[10]={0,1,0,-1,1,1,-1,-1},dy[10]={1,0,-1,0,1,-1,1,-1},dz[10]={0,0,0,0,1,-1};
long long mod=998244353,mod2=1000000009,mod3=2017;
long long x,z,y;
double pi=3.14159265;
P u[3];
stack<int> s;
//set<int> s[222][22];
//priority_queue<P> q;
queue<int> q;
//2147483647
//'1'==49;
//'A'==65;
//'a'==97;
//unordered_
//map<int,int> p;
/*
struct custom_hash {
    static uint64_t splitmix64(uint64_t x) {
        // http://xorshift.di.unimi.it/splitmix64.c
        x += 0x9e3779b97f4a7c15;
        x = (x ^ (x >> 30)) * 0xbf58476d1ce4e5b9;
        x = (x ^ (x >> 27)) * 0x94d049bb133111eb;
        return x ^ (x >> 31);
    }

    size_t operator()(uint64_t x) const {
        static const uint64_t FIXED_RANDOM = chrono::steady_clock::now().time_since_epoch().count();
        return splitmix64(x + FIXED_RANDOM);
    }
};
unordered_map<long long, int, custom_hash> safe_map;
*/
//list<int> l;

string r;
//char r[222253];
//deque<int> de;
//srand((int)time(NULL));
/*bool as(P a,P b)
{
    if(a.x!=b.x)
    return a.x<b.x;
    return a.y<b.y;
}*/

bool as(P a,P b)
{
    if(a.x!=b.x)
        return a.x<b.x;
    return a.y<b.y;
}

int f(int n,int m)
{
    printf("? %d %d\n",n,m);
    fflush(stdout);
    int p;
    scanf("%d",&p);
    return p;
}

void g1()
{
    n=b;
    for(int t=1;t<=a;t++)
    {
        for(;(c=f(t,t))&&(((n-c)%2+2)%2!=t%2);)
        {
            for(int w=t;w<=a;l[w]++,w++);
            n=c;
        }
        int x=n,y=c;
        for(int w=1;w<t;w++)
            if((l[w]+o[w])%2) x--;
            else y--;
        if((x>y&&l[t]%2==0)||(x<y&&l[t]%2)) o[t]=1;
        for(int w=1;w<=t;w++)
            l[w]++;
        n=c;
    }
}

void g2()
{
    /*n=b;
    for(int t=1;t<a;t++)
    {
        c=f(t,t+1);
        m=((n-c)%2+2)%2;
        if(m%2==t%2)
        {
            int x=0,y=0;
            for(int w=1;w<t;w++)
            {
                if((o[w]+l[w])%2) x++;
                else y++;
            }
            if((x-y<n-c&&(l[t])%2==0)||(x-y>n-c&&l[t]%2))
            {
                //printf("%d %d %d %d %d\n",x,y,n,c,t);
                o[t]=1;
            }
            for(int w=1;w<=t;w++)
                l[w]++;
        }
        else
        {
            //puts("#");
            int x=(n+c-(a-t))/2;
            for(int w=1;w<t;w++)
                if((o[w]+l[w])%2) x--;
            if((x&&l[t]%2==0)||(x==0&&l[t]%2)) o[t]=1;

            for(int w=t+1;w<=a;w++)
                l[w]++;

        }

        n=c;
    }

    for(int t=1;t<a;t++)
        d+=o[t];

    if(d==b) o[a]=0;
    else o[a]=1;*/

    n=b;
    for(int t=1;t<a;t++)
    {
        for(;(c=f(t,t+1))&&(((n-c)%2+2)%2!=t%2);)
        {
            for(int w=t+1;w<=a;l[w]++,w++);
            n=c;
        }
        int x=n,y=c;
        for(int w=1;w<t;w++)
            if((l[w]+o[w])%2) x--;
            else y--;
        if(((x==y+1)&&(l[t]%2==0))||((x+1==y)&&(l[t]%2))) o[t]=1;
        for(int w=1;w<=t;w++)
            l[w]++;
        n=c;
    }
    int x=0;
    for(int t=1;t<a;t++) x+=o[t];
    if(x<b) o[a]=1;
}

int main()
{
    scanf("%d %d",&a,&b);
    if(a%2) g2();
    else g1();
    printf("! ");
    for(int t=1;t<=a;t++)
        printf("%d",o[t]);
    puts("");
    fflush(stdout);
}


#include <bits/stdc++.h>
using namespace std;
//using lint = long long;

struct P
{
    int x,y;

    bool operator<(const P &a)const{
        if(x!=a.x)
              return x>a.x;
        return y>a.y;
    }

};

vector<int> v;

//bitset<4001000> b;
int i,n,d,m,k,a,b,c,h;

int o[311];
int l[311];
int j[331];
int e;

//int dx[10]={2,2,-2,-2,1,1,-1,-1},dy[10]={1,-1,1,-1,2,-2,2,-2};

int dx[10]={0,1,0,-1,1,1,-1,-1},dy[10]={1,0,-1,0,1,-1,1,-1},dz[10]={0,0,0,0,1,-1};
long long mod=998244353,mod2=1000000009,mod3=2017;
long long x,z,y;
double pi=3.14159265;
P u[3];
stack<int> s;
//set<int> s[222][22];
//priority_queue<P> q;
queue<int> q;
//2147483647
//'1'==49;
//'A'==65;
//'a'==97;
//unordered_
//map<int,int> p;
/*
struct custom_hash {
    static uint64_t splitmix64(uint64_t x) {
        // http://xorshift.di.unimi.it/splitmix64.c
        x += 0x9e3779b97f4a7c15;
        x = (x ^ (x >> 30)) * 0xbf58476d1ce4e5b9;
        x = (x ^ (x >> 27)) * 0x94d049bb133111eb;
        return x ^ (x >> 31);
    }

    size_t operator()(uint64_t x) const {
        static const uint64_t FIXED_RANDOM = chrono::steady_clock::now().time_since_epoch().count();
        return splitmix64(x + FIXED_RANDOM);
    }
};
unordered_map<long long, int, custom_hash> safe_map;
*/
//list<int> l;
//srand((int)time(NULL));
string r;
//char r[222253];
//deque<int> de;

/*bool as(P a,P b)
{
    if(a.x!=b.x)
    return a.x<b.x;
    return a.y<b.y;
}*/

bool as(P a,P b)
{
    if(a.x!=b.x)
        return a.x<b.x;
    return a.y<b.y;
}

int f(int n,int m)
{
    /*if(u)
    for(int t=1;t<=n;t++)
        j[t]=1-j[t];
    else
        for(int t=m;t<=a;t++)
        j[t]=1-j[t];
    printf("%d %d %d\n",n,m,u);
    int q=0;
    for(int t=1;t<=a;t++)
    q+=j[t];
    return q;
*/
    printf("? %d %d\n",n,m);
    fflush(stdout);
    int p;
    scanf("%d",&p);
    return p;
}

void g1()
{
    //srand((int)time(NULL));
    n=b;
    for(int t=1;t<=a;t++)
    {
        for(;(c=f(t,t))&&(((n-c)%2+2)%2!=t%2);)
        {
            //puts("#");
            for(int w=t;w<=a;l[w]++,w++);
            n=c;
        }
        int x=n,y=c;
        for(int w=1;w<t;w++)
            if((l[w]+o[w])%2) x--;
            else y--;
        if((x>y&&l[t]%2==0)||(x<y&&l[t]%2)) o[t]=1;
        for(int w=1;w<=t;w++)
            l[w]++;
        n=c;
    }
}

void g2()
{
    if(a==1)
    {
        if(b) o[1]=1;
        return;
    }

    n=b;
    for(;(c=f(2,a-1))&&((n-c)%2+2)%2==0;)
    {
        for(int t=1;t<a;t++)
            l[t]++;
        n=c;
    }
    if((n>(a-c)&&l[1]%2==0)||(n<(a-c)&&l[1]%2)) o[1]=1;
    for(int t=2;t<=a;t++)
        l[t]++;
    n=c;
    for(int t=2;t<=a;t++)
    {
        for(;(c=f(t-1,t))&&(((n-c)%2+2)%2!=t%2);)
        {
            for(int w=t-1;w<=a;l[w]++,w++);
            n=c;
        }
        int x=n,y=c;
        for(int w=1;w<t;w++)
            if((l[w]+o[w])%2) x--;
            else y--;
        if(((x==y+1)&&(l[t]%2==0))||((x+1==y)&&(l[t]%2))) o[t]=1;
        for(int w=1;w<=t;w++)
            l[w]++;
        n=c;
    }

}

int main()
{
    /*cin>>r;
    for(int t=0;t<r.size();b+=j[t+1],t++)
        j[t+1]=r[t]-'0';
    a=r.size();*/
    scanf("%d %d",&a,&b);
    if(a%2) g2();
    else g1();
    printf("! ");
    for(int t=1;t<=a;t++)
        printf("%d",o[t]);
    puts("");
    fflush(stdout);
}


#include <bits/stdc++.h>
using namespace std;
//using lint = long long;

struct P
{
    int x,y;

    bool operator<(const P &a)const{
        if(x!=a.x)
              return x>a.x;
        return y>a.y;
    }

};

vector<int> v;

//bitset<4001000> b;
int i,n,d,m,k,a,b,c,h;

int o[311];
int l[311];
int j[1];
int e;

//int dx[10]={2,2,-2,-2,1,1,-1,-1},dy[10]={1,-1,1,-1,2,-2,2,-2};

int dx[10]={0,1,0,-1,1,1,-1,-1},dy[10]={1,0,-1,0,1,-1,1,-1},dz[10]={0,0,0,0,1,-1};
long long mod=998244353,mod2=1000000009,mod3=2017;
long long x,z,y;
double pi=3.14159265;
P u[3];
stack<int> s;
//set<int> s[222][22];
//priority_queue<P> q;
queue<int> q;
//2147483647
//'1'==49;
//'A'==65;
//'a'==97;
//unordered_
//map<int,int> p;
/*
struct custom_hash {
    static uint64_t splitmix64(uint64_t x) {
        // http://xorshift.di.unimi.it/splitmix64.c
        x += 0x9e3779b97f4a7c15;
        x = (x ^ (x >> 30)) * 0xbf58476d1ce4e5b9;
        x = (x ^ (x >> 27)) * 0x94d049bb133111eb;
        return x ^ (x >> 31);
    }

    size_t operator()(uint64_t x) const {
        static const uint64_t FIXED_RANDOM = chrono::steady_clock::now().time_since_epoch().count();
        return splitmix64(x + FIXED_RANDOM);
    }
};
unordered_map<long long, int, custom_hash> safe_map;
*/
//list<int> l;

string r;
//char r[222253];
//deque<int> de;
//srand((int)time(NULL));
/*bool as(P a,P b)
{
    if(a.x!=b.x)
    return a.x<b.x;
    return a.y<b.y;
}*/

bool as(P a,P b)
{
    if(a.x!=b.x)
        return a.x<b.x;
    return a.y<b.y;
}

int f(int n,int m)
{
    printf("? %d %d\n",n,m);
    fflush(stdout);
    int p;
    scanf("%d",&p);
    return p;
}

void g1()
{
    n=b;
    for(int t=1;t<=a;t++)
    {
        for(;(c=f(t,t))&&(((n-c)%2+2)%2!=t%2);)
        {
            for(int w=t;w<=a;l[w]++,w++);
            n=c;
        }
        int x=n,y=c;
        for(int w=1;w<t;w++)
            if((l[w]+o[w])%2) x--;
            else y--;
        if((x>y&&l[t]%2==0)||(x<y&&l[t]%2)) o[t]=1;
        for(int w=1;w<=t;w++)
            l[w]++;
        n=c;
    }
}

void g2()
{
    /*n=b;
    for(int t=1;t<a;t++)
    {
        c=f(t,t+1);
        m=((n-c)%2+2)%2;
        if(m%2==t%2)
        {
            int x=0,y=0;
            for(int w=1;w<t;w++)
            {
                if((o[w]+l[w])%2) x++;
                else y++;
            }
            if((x-y<n-c&&(l[t])%2==0)||(x-y>n-c&&l[t]%2))
            {
                //printf("%d %d %d %d %d\n",x,y,n,c,t);
                o[t]=1;
            }
            for(int w=1;w<=t;w++)
                l[w]++;
        }
        else
        {
            //puts("#");
            int x=(n+c-(a-t))/2;
            for(int w=1;w<t;w++)
                if((o[w]+l[w])%2) x--;
            if((x&&l[t]%2==0)||(x==0&&l[t]%2)) o[t]=1;

            for(int w=t+1;w<=a;w++)
                l[w]++;

        }

        n=c;
    }

    for(int t=1;t<a;t++)
        d+=o[t];

    if(d==b) o[a]=0;
    else o[a]=1;*/

    n=b;
    for(int t=1;t<a;t++)
    {
        for(;(c=f(t,t+1))&&(((n-c)%2+2)%2!=t%2);)
        {
            for(int w=t+1;w<=a;l[w]++,w++);
            n=c;
        }
        int x=n,y=c;
        for(int w=1;w<t;w++)
            if((l[w]+o[w])%2) x--;
            else y--;
        if((x>y&&l[t]%2==0)||(x<y&&(l[t]%2))) o[t]=1;
        for(int w=1;w<=t;w++)
            l[w]++;
        n=c;
    }
    int x=0;
    for(int t=1;t<a;t++) x+=o[t];
    if(x<b) o[a]=1;
}

int main()
{
    scanf("%d %d",&a,&b);
    if(a%2) g2();
    else g1();
    printf("! ");
    for(int t=1;t<=a;t++)
        printf("%d",o[t]);
    puts("");
    fflush(stdout);
}


#include <bits/stdc++.h>
using namespace std;
//using lint = long long;

struct P
{
    int x,y;

    bool operator<(const P &a)const{
        if(x!=a.x)
              return x>a.x;
        return y>a.y;
    }

};

vector<int> v;

//bitset<4001000> b;
int i,n,d,m,k,a,b,c,h;

int o[311];
int l[311];
int j[331];
int e;

//int dx[10]={2,2,-2,-2,1,1,-1,-1},dy[10]={1,-1,1,-1,2,-2,2,-2};

int dx[10]={0,1,0,-1,1,1,-1,-1},dy[10]={1,0,-1,0,1,-1,1,-1},dz[10]={0,0,0,0,1,-1};
long long mod=998244353,mod2=1000000009,mod3=2017;
long long x,z,y;
double pi=3.14159265;
P u[3];
stack<int> s;
//set<int> s[222][22];
//priority_queue<P> q;
queue<int> q;
//2147483647
//'1'==49;
//'A'==65;
//'a'==97;
//unordered_
//map<int,int> p;
/*
struct custom_hash {
    static uint64_t splitmix64(uint64_t x) {
        // http://xorshift.di.unimi.it/splitmix64.c
        x += 0x9e3779b97f4a7c15;
        x = (x ^ (x >> 30)) * 0xbf58476d1ce4e5b9;
        x = (x ^ (x >> 27)) * 0x94d049bb133111eb;
        return x ^ (x >> 31);
    }

    size_t operator()(uint64_t x) const {
        static const uint64_t FIXED_RANDOM = chrono::steady_clock::now().time_since_epoch().count();
        return splitmix64(x + FIXED_RANDOM);
    }
};
unordered_map<long long, int, custom_hash> safe_map;
*/
//list<int> l;
//srand((int)time(NULL));
string r;
//char r[222253];
//deque<int> de;

/*bool as(P a,P b)
{
    if(a.x!=b.x)
    return a.x<b.x;
    return a.y<b.y;
}*/

bool as(P a,P b)
{
    if(a.x!=b.x)
        return a.x<b.x;
    return a.y<b.y;
}

int f(int n,int m,int u)
{
    //srand((int)time(NULL));

    /*if(u)
    for(int t=1;t<=m;t++)
        j[t]=1-j[t];
    else
        for(int t=n;t<=a;t++)
        j[t]=1-j[t];

    int q=0;
    for(int t=1;t<=a;t++)
    q+=j[t];
    printf("%d %d %d %d\n",n,m,u,q);
    return q;*/

    printf("? %d %d\n",n,m);
    fflush(stdout);
    int p;
    scanf("%d",&p);
    return p;
}

void g1()
{
    //srand((int)time(NULL));
    n=b;
    for(int t=1;t<=a;t++)
    {
        for(;(c=f(t,t))&&(((n-c)%2+2)%2!=t%2);)
        {
            //puts("#");
            for(int w=t;w<=a;l[w]++,w++);
            n=c;
        }
        int x=n,y=c;
        for(int w=1;w<t;w++)
            if((l[w]+o[w])%2) x--;
            else y--;
        if((x>y&&l[t]%2==0)||(x<y&&l[t]%2)) o[t]=1;
        for(int w=1;w<=t;w++)
            l[w]++;
        n=c;
    }
}

void g2()
{
    //srand((int)time(NULL));
    if(a==1)
    {
        if(b) o[1]=1;
        return;
    }

    n=b;
    for(;(c=f(2,a))&&((n-c)%2+2)%2;)
    {
        for(int t=1;t<=a;t++)
            l[t]++;
        n=c;
    }
    if((n>(a-c)&&l[1]%2==0)||(n<(a-c)&&l[1]%2)) o[1]=1;
    for(int t=2;t<=a;t++)
        l[t]++;
    n=c;
    for(int t=2;t<=a;t++)
    {
        for(;(c=f(t-1,t))&&(((n-c)%2+2)%2!=t%2);)
        {
            //puts("#");
            for(int w=t-1;w<=a;l[w]++,w++);
            n=c;
        }
        int x=n,y=c;
        for(int w=1;w<t;w++)
            if((l[w]+o[w])%2) x--;
            else y--;
        if((x>y&&l[t]%2==0)||(x<y&&l[t]%2)) o[t]=1;
        for(int w=1;w<=t;w++)
            l[w]++;
        n=c;
    }

}

int main()
{
    /*cin>>r;
    for(int t=0;t<r.size();b+=j[t+1],t++)
        j[t+1]=r[t]-'0';
    a=r.size();*/
    scanf("%d %d",&a,&b);
    if(a==b)
    {
        for(int t=1;t<=a;o[t]=1,t++);
    }
    else if(b==0)
    {
        ;
    }
    else if(a%2) g2();
    else g1();
    printf("! ");
    for(int t=1;t<=a;t++)
        printf("%d",o[t]);
    puts("");
    fflush(stdout);
}


#include <bits/stdc++.h>
using namespace std;
//using lint = long long;

struct P
{
    int x,y;

    bool operator<(const P &a)const{
        if(x!=a.x)
              return x>a.x;
        return y>a.y;
    }

};

vector<int> v;

//bitset<4001000> b;
int i,n,d,m,k,a,b,c,h;

int o[311];
int l[311];
int j[331];
int e;

//int dx[10]={2,2,-2,-2,1,1,-1,-1},dy[10]={1,-1,1,-1,2,-2,2,-2};

int dx[10]={0,1,0,-1,1,1,-1,-1},dy[10]={1,0,-1,0,1,-1,1,-1},dz[10]={0,0,0,0,1,-1};
long long mod=998244353,mod2=1000000009,mod3=2017;
long long x,z,y;
double pi=3.14159265;
P u[3];
stack<int> s;
//set<int> s[222][22];
//priority_queue<P> q;
queue<int> q;
//2147483647
//'1'==49;
//'A'==65;
//'a'==97;
//unordered_
//map<int,int> p;
/*
struct custom_hash {
    static uint64_t splitmix64(uint64_t x) {
        // http://xorshift.di.unimi.it/splitmix64.c
        x += 0x9e3779b97f4a7c15;
        x = (x ^ (x >> 30)) * 0xbf58476d1ce4e5b9;
        x = (x ^ (x >> 27)) * 0x94d049bb133111eb;
        return x ^ (x >> 31);
    }

    size_t operator()(uint64_t x) const {
        static const uint64_t FIXED_RANDOM = chrono::steady_clock::now().time_since_epoch().count();
        return splitmix64(x + FIXED_RANDOM);
    }
};
unordered_map<long long, int, custom_hash> safe_map;
*/
//list<int> l;
//srand((int)time(NULL));
string r;
//char r[222253];
//deque<int> de;

/*bool as(P a,P b)
{
    if(a.x!=b.x)
    return a.x<b.x;
    return a.y<b.y;
}*/

bool as(P a,P b)
{
    if(a.x!=b.x)
        return a.x<b.x;
    return a.y<b.y;
}

int f(int n,int m,int u)
{
    //srand((int)time(NULL));

    /*if(u)
    for(int t=1;t<=m;t++)
        j[t]=1-j[t];
    else
        for(int t=n;t<=a;t++)
        j[t]=1-j[t];

    int q=0;
    for(int t=1;t<=a;t++)
    q+=j[t];
    printf("%d %d %d %d\n",n,m,u,q);
    return q;*/

    printf("? %d %d\n",n,m);
    fflush(stdout);
    int p;
    scanf("%d",&p);
    return p;
}

void g1()
{
    //srand((int)time(NULL));
    n=b;
    for(int t=1;t<=a;t++)
    {
        for(;(c=f(t,t,0))&&(((n-c)%2+2)%2!=t%2);)
        {
            //puts("#");
            for(int w=t;w<=a;l[w]++,w++);
            n=c;
        }
        int x=n,y=c;
        for(int w=1;w<t;w++)
            if((l[w]+o[w])%2) x--;
            else y--;
        if((x>y&&l[t]%2==0)||(x<y&&l[t]%2)) o[t]=1;
        for(int w=1;w<=t;w++)
            l[w]++;
        n=c;
    }
}

void g2()
{
    //srand((int)time(NULL));
    if(a==1)
    {
        if(b) o[1]=1;
        return;
    }

    n=b;
    for(;(c=f(2,a,0))&&((n-c)%2+2)%2;)
    {
        for(int t=1;t<=a;t++)
            l[t]++;
        n=c;
    }
    if((n>(a-c)&&l[1]%2==0)||(n<(a-c)&&l[1]%2)) o[1]=1;
    for(int t=2;t<=a;t++)
        l[t]++;
    n=c;
    for(int t=2;t<a;t++)
    {
        for(;(c=f(t-1,t,0))&&(((n-c)%2+2)%2!=t%2);)
        {
            //puts("#");
            for(int w=t-1;w<=a;l[w]++,w++);
            n=c;
        }
        int x=n,y=c;
        for(int w=1;w<t;w++)
            if((l[w]+o[w])%2) x--;
            else y--;
        if((x>y&&l[t]%2==0)||(x<y&&l[t]%2==1)) o[t]=1;
        for(int w=1;w<=t;w++)
            l[w]++;
        n=c;
    }
    int x=0;
    for(int t=1;t<a;x+=o[t],t++);
    if(x<b) o[a]=1;
}

int main()
{
    /*cin>>r;
    for(int t=0;t<r.size();b+=j[t+1],t++)
        j[t+1]=r[t]-'0';
    a=r.size();*/
    scanf("%d %d",&a,&b);
    if(a==b)
    {
        for(int t=1;t<=a;o[t]=1,t++);
    }
    else if(b==0)
    {
        ;
    }
    else if(a%2) g2();
    else g1();
    printf("! ");
    for(int t=1;t<=a;t++)
        printf("%d",o[t]);
    puts("");
    fflush(stdout);
}


#include <bits/stdc++.h>
using namespace std;
//using lint = long long;

struct P
{
    int x,y;

    bool operator<(const P &a)const{
        if(x!=a.x)
              return x>a.x;
        return y>a.y;
    }

};

vector<int> v;

//bitset<4001000> b;
int i,n,d,m,k,a,b,c,h;

int o[311];
int l[311];
int j[1];
int e;

//int dx[10]={2,2,-2,-2,1,1,-1,-1},dy[10]={1,-1,1,-1,2,-2,2,-2};

int dx[10]={0,1,0,-1,1,1,-1,-1},dy[10]={1,0,-1,0,1,-1,1,-1},dz[10]={0,0,0,0,1,-1};
long long mod=998244353,mod2=1000000009,mod3=2017;
long long x,z,y;
double pi=3.14159265;
P u[3];
stack<int> s;
//set<int> s[222][22];
//priority_queue<P> q;
queue<int> q;
//2147483647
//'1'==49;
//'A'==65;
//'a'==97;
//unordered_
//map<int,int> p;
/*
struct custom_hash {
    static uint64_t splitmix64(uint64_t x) {
        // http://xorshift.di.unimi.it/splitmix64.c
        x += 0x9e3779b97f4a7c15;
        x = (x ^ (x >> 30)) * 0xbf58476d1ce4e5b9;
        x = (x ^ (x >> 27)) * 0x94d049bb133111eb;
        return x ^ (x >> 31);
    }

    size_t operator()(uint64_t x) const {
        static const uint64_t FIXED_RANDOM = chrono::steady_clock::now().time_since_epoch().count();
        return splitmix64(x + FIXED_RANDOM);
    }
};
unordered_map<long long, int, custom_hash> safe_map;
*/
//list<int> l;

string r;
//char r[222253];
//deque<int> de;
//srand((int)time(NULL));
/*bool as(P a,P b)
{
    if(a.x!=b.x)
    return a.x<b.x;
    return a.y<b.y;
}*/

bool as(P a,P b)
{
    if(a.x!=b.x)
        return a.x<b.x;
    return a.y<b.y;
}

int f(int n,int m)
{
    printf("? %d %d\n",n,m);
    fflush(stdout);
    int p;
    scanf("%d",&p);
    return p;
}

void g1()
{
    n=b;
    for(int t=1;t<=a;t++)
    {
        for(;(c=f(t,t))&&((n-c)%2+2)%2!=t%2;)
        {
            for(int w=t;w<=a;l[w]++,w++);
            n=c;
        }
        int x=n,y=c;
        for(int w=1;w<t;w++)
            if((l[w]+o[w])%2) x--;
            else y--;
        if((x>y&&l[t]%2==0)||(x<y&&l[t]%2)) o[t]=1;
        for(int w=1;w<=t;w++)
            l[w]++;
        n=c;
    }
}

void g2()
{
    /*n=b;
    for(int t=1;t<a;t++)
    {
        c=f(t,t+1);
        m=((n-c)%2+2)%2;
        if(m%2==t%2)
        {
            int x=0,y=0;
            for(int w=1;w<t;w++)
            {
                if((o[w]+l[w])%2) x++;
                else y++;
            }
            if((x-y<n-c&&(l[t])%2==0)||(x-y>n-c&&l[t]%2))
            {
                //printf("%d %d %d %d %d\n",x,y,n,c,t);
                o[t]=1;
            }
            for(int w=1;w<=t;w++)
                l[w]++;
        }
        else
        {
            //puts("#");
            int x=(n+c-(a-t))/2;
            for(int w=1;w<t;w++)
                if((o[w]+l[w])%2) x--;
            if((x&&l[t]%2==0)||(x==0&&l[t]%2)) o[t]=1;

            for(int w=t+1;w<=a;w++)
                l[w]++;

        }

        n=c;
    }

    for(int t=1;t<a;t++)
        d+=o[t];

    if(d==b) o[a]=0;
    else o[a]=1;*/

    n=b;
    for(int t=1;t<a;t++)
    {
        for(;c=f(t,t+1)&&((n-c)%2+2)%2!=t%2;)
        {
            for(int w=t+1;w<=a;l[w]++,w++);
            n=c;
        }
        int x=n,y=c;
        for(int w=1;w<t;w++)
            if((l[w]+o[w])%2) x--;
            else y--;
        if((x>y&&l[t]%2==0)||(x<y&&l[t]%2)) o[t]=1;
        for(int w=1;w<=t;w++)
            l[w]++;
        n=c;
    }
    int x=0;
    for(int t=1;t<a;t++) x+=o[t];
    if(x<b) o[a]=1;
}

int main()
{
    scanf("%d %d",&a,&b);
    if(a%2) g2();
    else g1();
    printf("! ");
    for(int t=1;t<=a;t++)
        printf("%d",o[t]);
    puts("");
    fflush(stdout);
}


#include <bits/stdc++.h>
using namespace std;
//using lint = long long;

struct P
{
    int x,y;

    bool operator<(const P &a)const{
        if(x!=a.x)
              return x>a.x;
        return y>a.y;
    }

};

vector<int> v;

//bitset<4001000> b;
int i,n,d,m,k,a,b,c,h;

int o[311];
int l[311];
int j[1];
int e;

//int dx[10]={2,2,-2,-2,1,1,-1,-1},dy[10]={1,-1,1,-1,2,-2,2,-2};

int dx[10]={0,1,0,-1,1,1,-1,-1},dy[10]={1,0,-1,0,1,-1,1,-1},dz[10]={0,0,0,0,1,-1};
long long mod=998244353,mod2=1000000009,mod3=2017;
long long x,z,y;
double pi=3.14159265;
P u[3];
stack<int> s;
//set<int> s[222][22];
//priority_queue<P> q;
queue<int> q;
//2147483647
//'1'==49;
//'A'==65;
//'a'==97;
//unordered_
//map<int,int> p;
/*
struct custom_hash {
    static uint64_t splitmix64(uint64_t x) {
        // http://xorshift.di.unimi.it/splitmix64.c
        x += 0x9e3779b97f4a7c15;
        x = (x ^ (x >> 30)) * 0xbf58476d1ce4e5b9;
        x = (x ^ (x >> 27)) * 0x94d049bb133111eb;
        return x ^ (x >> 31);
    }

    size_t operator()(uint64_t x) const {
        static const uint64_t FIXED_RANDOM = chrono::steady_clock::now().time_since_epoch().count();
        return splitmix64(x + FIXED_RANDOM);
    }
};
unordered_map<long long, int, custom_hash> safe_map;
*/
//list<int> l;

string r;
//char r[222253];
//deque<int> de;
//srand((int)time(NULL));
/*bool as(P a,P b)
{
    if(a.x!=b.x)
    return a.x<b.x;
    return a.y<b.y;
}*/

bool as(P a,P b)
{
    if(a.x!=b.x)
        return a.x<b.x;
    return a.y<b.y;
}

int f(int n,int m)
{
    printf("? %d %d\n",n,m);
    fflush(stdout);
    int p;
    scanf("%d",&p);
    return p;
}

void g1()
{
    n=b;
    for(int t=1;t<=a;t++)
    {
        for(;c=f(t,t)&&((n-c)%2+2)%2!=t%2;)
        {
            for(int w=t;w<=a;l[w]++,w++);
            n=c;
        }
        int x=n,y=c;
        for(int w=1;w<t;w++)
            if((l[w]+o[w])%2) x--;
            else y--;
        if((x>y&&l[t]%2==0)||(x<y&&l[t]%2)) o[t]=1;
        for(int w=1;w<=t;w++)
            l[w]++;
        n=c;
    }
}

void g2()
{
    /*n=b;
    for(int t=1;t<a;t++)
    {
        c=f(t,t+1);
        m=((n-c)%2+2)%2;
        if(m%2==t%2)
        {
            int x=0,y=0;
            for(int w=1;w<t;w++)
            {
                if((o[w]+l[w])%2) x++;
                else y++;
            }
            if((x-y<n-c&&(l[t])%2==0)||(x-y>n-c&&l[t]%2))
            {
                //printf("%d %d %d %d %d\n",x,y,n,c,t);
                o[t]=1;
            }
            for(int w=1;w<=t;w++)
                l[w]++;
        }
        else
        {
            //puts("#");
            int x=(n+c-(a-t))/2;
            for(int w=1;w<t;w++)
                if((o[w]+l[w])%2) x--;
            if((x&&l[t]%2==0)||(x==0&&l[t]%2)) o[t]=1;

            for(int w=t+1;w<=a;w++)
                l[w]++;

        }

        n=c;
    }

    for(int t=1;t<a;t++)
        d+=o[t];

    if(d==b) o[a]=0;
    else o[a]=1;*/

    n=b;
    for(int t=1;t<a;t++)
    {
        for(;c=f(t,t+1)&&((n-c)%2+2)%2!=t%2;)
        {
            for(int w=t+1;w<=a;l[w]++,w++);
            n=c;
        }
        int x=n,y=c;
        for(int w=1;w<t;w++)
            if((l[w]+o[w])%2) x--;
            else y--;
        if((x>y&&l[t]%2==0)||(x<y&&l[t]%2)) o[t]=1;
        for(int w=1;w<=t;w++)
            l[w]++;
        n=c;
    }
    int x=0;
    for(int t=1;t<a;t++) x+=o[t];
    if(x<b) o[a]=1;
}

int main()
{
    scanf("%d %d",&a,&b);
    if(a%2) g2();
    else g1();
    printf("! ");
    for(int t=1;t<=a;t++)
        printf("%d",o[t]);
    puts("");
    fflush(stdout);
}


#include <bits/stdc++.h>
using namespace std;
//using lint = long long;

struct P
{
    int x,y;

    bool operator<(const P &a)const{
        if(x!=a.x)
              return x>a.x;
        return y>a.y;
    }

};

vector<int> v;

//bitset<4001000> b;
int i,n,d,m,k,a,b,c,h;

int o[311];
int l[311];
int j[331];
int e;

//int dx[10]={2,2,-2,-2,1,1,-1,-1},dy[10]={1,-1,1,-1,2,-2,2,-2};

int dx[10]={0,1,0,-1,1,1,-1,-1},dy[10]={1,0,-1,0,1,-1,1,-1},dz[10]={0,0,0,0,1,-1};
long long mod=998244353,mod2=1000000009,mod3=2017;
long long x,z,y;
double pi=3.14159265;
P u[3];
stack<int> s;
//set<int> s[222][22];
//priority_queue<P> q;
queue<int> q;
//2147483647
//'1'==49;
//'A'==65;
//'a'==97;
//unordered_
//map<int,int> p;
/*
struct custom_hash {
    static uint64_t splitmix64(uint64_t x) {
        // http://xorshift.di.unimi.it/splitmix64.c
        x += 0x9e3779b97f4a7c15;
        x = (x ^ (x >> 30)) * 0xbf58476d1ce4e5b9;
        x = (x ^ (x >> 27)) * 0x94d049bb133111eb;
        return x ^ (x >> 31);
    }

    size_t operator()(uint64_t x) const {
        static const uint64_t FIXED_RANDOM = chrono::steady_clock::now().time_since_epoch().count();
        return splitmix64(x + FIXED_RANDOM);
    }
};
unordered_map<long long, int, custom_hash> safe_map;
*/
//list<int> l;
//srand((int)time(NULL));
string r;
//char r[222253];
//deque<int> de;

/*bool as(P a,P b)
{
    if(a.x!=b.x)
    return a.x<b.x;
    return a.y<b.y;
}*/

bool as(P a,P b)
{
    if(a.x!=b.x)
        return a.x<b.x;
    return a.y<b.y;
}

int f(int n,int m)
{
    /*if(u)
    for(int t=1;t<=n;t++)
        j[t]=1-j[t];
    else
        for(int t=m;t<=a;t++)
        j[t]=1-j[t];
    printf("%d %d %d\n",n,m,u);
    int q=0;
    for(int t=1;t<=a;t++)
    q+=j[t];
    return q;
*/
    printf("? %d %d\n",n,m);
    fflush(stdout);
    int p;
    scanf("%d",&p);
    return p;
}

void g1()
{
    //srand((int)time(NULL));
    n=b;
    for(int t=1;t<=a;t++)
    {
        for(;(c=f(t,t))&&(((n-c)%2+2)%2!=t%2);)
        {
            //puts("#");
            for(int w=t;w<=a;l[w]++,w++);
            n=c;
        }
        int x=n,y=c;
        for(int w=1;w<t;w++)
            if((l[w]+o[w])%2) x--;
            else y--;
        if((x>y&&l[t]%2==0)||(x<y&&l[t]%2)) o[t]=1;
        for(int w=1;w<=t;w++)
            l[w]++;
        n=c;
    }
}

void g2()
{
    if(a==1)
    {
        if(b) o[1]=1;
        return;
    }

    n=b;
    for(;(c=f(2,a-1))&&((n-c)%2+2)%2==0;)
    {
        for(int t=1;t<a;t++)
            l[t]++;
        n=c;
    }
    if(n>(a-c)&&l[1]%2==0)||(n<(a-c)&&l[1]%2) o[1]=1;
    for(int t=2;t<=a;t++)
        l[t]++;
    n=c;
    for(int t=2;t<=a;t++)
    {
        for(;(c=f(t-1,t))&&(((n-c)%2+2)%2!=t%2);)
        {
            for(int w=t-1;w<=a;l[w]++,w++);
            n=c;
        }
        int x=n,y=c;
        for(int w=1;w<t;w++)
            if((l[w]+o[w])%2) x--;
            else y--;
        if(((x==y+1)&&(l[t]%2==0))||((x+1==y)&&(l[t]%2))) o[t]=1;
        for(int w=1;w<=t;w++)
            l[w]++;
        n=c;
    }

}

int main()
{
    cin>>r;
    for(int t=0;t<r.size();b+=j[t+1],t++)
        j[t+1]=r[t]-'0';
    a=r.size();
    //scanf("%d %d",&a,&b);
    if(a%2) g2();
    else g1();
    printf("! ");
    for(int t=1;t<=a;t++)
        printf("%d",o[t]);
    puts("");
    fflush(stdout);
}


#include <bits/stdc++.h>
using namespace std;
//using lint = long long;

struct P
{
    int x,y;

    bool operator<(const P &a)const{
        if(x!=a.x)
              return x>a.x;
        return y>a.y;
    }

};

vector<int> v;

//bitset<4001000> b;
int i,n,d,m,k,a,b,c,h;

int o[311];
int l[311];
int j[331];
int e;

//int dx[10]={2,2,-2,-2,1,1,-1,-1},dy[10]={1,-1,1,-1,2,-2,2,-2};

int dx[10]={0,1,0,-1,1,1,-1,-1},dy[10]={1,0,-1,0,1,-1,1,-1},dz[10]={0,0,0,0,1,-1};
long long mod=998244353,mod2=1000000009,mod3=2017;
long long x,z,y;
double pi=3.14159265;
P u[3];
stack<int> s;
//set<int> s[222][22];
//priority_queue<P> q;
queue<int> q;
//2147483647
//'1'==49;
//'A'==65;
//'a'==97;
//unordered_
//map<int,int> p;
/*
struct custom_hash {
    static uint64_t splitmix64(uint64_t x) {
        // http://xorshift.di.unimi.it/splitmix64.c
        x += 0x9e3779b97f4a7c15;
        x = (x ^ (x >> 30)) * 0xbf58476d1ce4e5b9;
        x = (x ^ (x >> 27)) * 0x94d049bb133111eb;
        return x ^ (x >> 31);
    }

    size_t operator()(uint64_t x) const {
        static const uint64_t FIXED_RANDOM = chrono::steady_clock::now().time_since_epoch().count();
        return splitmix64(x + FIXED_RANDOM);
    }
};
unordered_map<long long, int, custom_hash> safe_map;
*/
//list<int> l;

string r;
//char r[222253];
//deque<int> de;
//srand((int)time(NULL));
/*bool as(P a,P b)
{
    if(a.x!=b.x)
    return a.x<b.x;
    return a.y<b.y;
}*/

bool as(P a,P b)
{
    if(a.x!=b.x)
        return a.x<b.x;
    return a.y<b.y;
}

int f(int n,int m)
{
    /*if(rand()%2)
    for(int t=1;t<=n;t++)
        j[t]=1-j[t];
    else
        for(int t=m;t<=a;t++)
        j[t]=1-j[t];
    int q=0;
    for(int t=1;t<=a;t++)
    q+=j[t];
    return q;*/

    printf("? %d %d\n",n,m);
    fflush(stdout);
    int p;
    scanf("%d",&p);
    return p;
}

void g1()
{
    n=b;
    for(int t=1;t<=a;t++)
    {
        for(;(c=f(t,t))&&(((n-c)%2+2)%2!=t%2);)
        {
            //puts("#");
            for(int w=t;w<=a;l[w]++,w++);
            n=c;
        }
        int x=n,y=c;
        for(int w=1;w<t;w++)
            if((l[w]+o[w])%2) x--;
            else y--;
        if((x>y&&l[t]%2==0)||(x<y&&l[t]%2)) o[t]=1;
        for(int w=1;w<=t;w++)
            l[w]++;
        n=c;
    }
}

void g2()
{
    /*n=b;
    for(int t=1;t<a;t++)
    {
        c=f(t,t+1);
        m=((n-c)%2+2)%2;
        if(m%2==t%2)
        {
            int x=0,y=0;
            for(int w=1;w<t;w++)
            {
                if((o[w]+l[w])%2) x++;
                else y++;
            }
            if((x-y<n-c&&(l[t])%2==0)||(x-y>n-c&&l[t]%2))
            {
                //printf("%d %d %d %d %d\n",x,y,n,c,t);
                o[t]=1;
            }
            for(int w=1;w<=t;w++)
                l[w]++;
        }
        else
        {
            //puts("#");
            int x=(n+c-(a-t))/2;
            for(int w=1;w<t;w++)
                if((o[w]+l[w])%2) x--;
            if((x&&l[t]%2==0)||(x==0&&l[t]%2)) o[t]=1;

            for(int w=t+1;w<=a;w++)
                l[w]++;

        }

        n=c;
    }

    for(int t=1;t<a;t++)
        d+=o[t];

    if(d==b) o[a]=0;
    else o[a]=1;*/

    //return;

    n=b;
    for(int t=1;t<a;t++)
    {
        for(;(c=f(t,t+1))&&(((n-c)%2+2)%2!=t%2);)
        {
            for(int w=t+1;w<=a;l[w]++,w++);
            n=c;
        }
        int x=n,y=c;
        for(int w=1;w<t;w++)
            if((l[w]+o[w])%2) x--;
            else y--;
        if(((x==y+1)&&(l[t]%2==0))||((x+1==y)&&(l[t]%2))) o[t]=1;
        for(int w=1;w<=t;w++)
            l[w]++;
        n=c;
    }
    int x=0;
    for(int t=1;t<a;t++) x+=o[t];
    if(x<b) o[a]=1;
}

int main()
{
    //cin>>r;
    //for(int t=0;t<r.size();b+=j[t+1],t++)
    //    j[t+1]=r[t]-'0';
    //a=r.size();
    scanf("%d %d",&a,&b);
    if(a%2) g2();
    else g1();
    printf("! ");
    for(int t=1;t<=a;t++)
        printf("%d",o[t]);
    puts("");
    fflush(stdout);
}


#include <bits/stdc++.h>
using namespace std;
//using lint = long long;

struct P
{
    int x,y;

    bool operator<(const P &a)const{
        if(x!=a.x)
              return x>a.x;
        return y>a.y;
    }

};

vector<int> v;

//bitset<4001000> b;
int i,n,d,m,k,a,b,c,h;

int o[311];
int l[311];
int j[331];
int e;

//int dx[10]={2,2,-2,-2,1,1,-1,-1},dy[10]={1,-1,1,-1,2,-2,2,-2};

int dx[10]={0,1,0,-1,1,1,-1,-1},dy[10]={1,0,-1,0,1,-1,1,-1},dz[10]={0,0,0,0,1,-1};
long long mod=998244353,mod2=1000000009,mod3=2017;
long long x,z,y;
double pi=3.14159265;
P u[3];
stack<int> s;
//set<int> s[222][22];
//priority_queue<P> q;
queue<int> q;
//2147483647
//'1'==49;
//'A'==65;
//'a'==97;
//unordered_
//map<int,int> p;
/*
struct custom_hash {
    static uint64_t splitmix64(uint64_t x) {
        // http://xorshift.di.unimi.it/splitmix64.c
        x += 0x9e3779b97f4a7c15;
        x = (x ^ (x >> 30)) * 0xbf58476d1ce4e5b9;
        x = (x ^ (x >> 27)) * 0x94d049bb133111eb;
        return x ^ (x >> 31);
    }

    size_t operator()(uint64_t x) const {
        static const uint64_t FIXED_RANDOM = chrono::steady_clock::now().time_since_epoch().count();
        return splitmix64(x + FIXED_RANDOM);
    }
};
unordered_map<long long, int, custom_hash> safe_map;
*/
//list<int> l;
//srand((int)time(NULL));
string r;
//char r[222253];
//deque<int> de;

/*bool as(P a,P b)
{
    if(a.x!=b.x)
    return a.x<b.x;
    return a.y<b.y;
}*/

bool as(P a,P b)
{
    if(a.x!=b.x)
        return a.x<b.x;
    return a.y<b.y;
}

int f(int n,int m)
{
    /*if(u)
    for(int t=1;t<=n;t++)
        j[t]=1-j[t];
    else
        for(int t=m;t<=a;t++)
        j[t]=1-j[t];
    printf("%d %d %d\n",n,m,u);
    int q=0;
    for(int t=1;t<=a;t++)
    q+=j[t];
    return q;
*/
    printf("? %d %d\n",n,m);
    fflush(stdout);
    int p;
    scanf("%d",&p);
    return p;
}

void g1()
{
    //srand((int)time(NULL));
    n=b;
    for(int t=1;t<=a;t++)
    {
        for(;(c=f(t,t))&&(((n-c)%2+2)%2!=t%2);)
        {
            //puts("#");
            for(int w=t;w<=a;l[w]++,w++);
            n=c;
        }
        int x=n,y=c;
        for(int w=1;w<t;w++)
            if((l[w]+o[w])%2) x--;
            else y--;
        if((x>y&&l[t]%2==0)||(x<y&&l[t]%2)) o[t]=1;
        for(int w=1;w<=t;w++)
            l[w]++;
        n=c;
    }
}

void g2()
{
    if(a==1)
    {
        if(b) o[1]=1;
        return;
    }

    n=b;
    for(;(c=f(2,a-2))&&((n-c)%2+2)%2;)
    {
        for(int t=1;t<a-1;t++)
            l[t]++;
        n=c;
    }
    if((n>(a-c)&&l[1]%2==0)||(n<(a-c)&&l[1]%2)) o[1]=1;
    for(int t=2;t<=a;t++)
        l[t]++;
    n=c;
    for(int t=2;t<=a;t++)
    {
        for(;(c=f(t-1,t))&&(((n-c)%2+2)%2!=t%2);)
        {
            for(int w=t-1;w<=a;l[w]++,w++);
            n=c;
        }
        int x=n,y=c;
        for(int w=1;w<t;w++)
            if((l[w]+o[w])%2) x--;
            else y--;
        if(((x==y+1)&&(l[t]%2==0))||((x+1==y)&&(l[t]%2))) o[t]=1;
        for(int w=1;w<=t;w++)
            l[w]++;
        n=c;
    }

}

int main()
{
    /*cin>>r;
    for(int t=0;t<r.size();b+=j[t+1],t++)
        j[t+1]=r[t]-'0';
    a=r.size();*/
    scanf("%d %d",&a,&b);
    if(a==b)
    {
        for(int t=1;t<=a;o[t]=1,t++);
    }
    else if(a==0)
    {
        ;
    }
    else if(a%2) g2();
    else g1();
    printf("! ");
    for(int t=1;t<=a;t++)
        printf("%d",o[t]);
    puts("");
    fflush(stdout);
}


#include <bits/stdc++.h>
using namespace std;
//using lint = long long;

struct P
{
    int x,y;

    bool operator<(const P &a)const{
        if(x!=a.x)
              return x>a.x;
        return y>a.y;
    }

};

vector<long long> v[11];

//bitset<4001000> b;
int i,n,d,m,k,a,b,c,h;

int o[311];
int l[11];
int j[1];
int e;

//int dx[10]={2,2,-2,-2,1,1,-1,-1},dy[10]={1,-1,1,-1,2,-2,2,-2};

int dx[10]={0,1,0,-1,1,1,-1,-1},dy[10]={1,0,-1,0,1,-1,1,-1},dz[10]={0,0,0,0,1,-1};
long long mod=998244353,mod2=1000000009,mod3=2017;
long long x,z,y;
double pi=3.14159265;
P u[3];
stack<long long> s;
//set<int> s[222][22];
//priority_queue<P> q;
//queue<int> q;
//2147483647
//'1'==49;
//'A'==65;
//'a'==97;
//unordered_
//map<int,int> p;
/*
struct custom_hash {
    static uint64_t splitmix64(uint64_t x) {
        // http://xorshift.di.unimi.it/splitmix64.c
        x += 0x9e3779b97f4a7c15;
        x = (x ^ (x >> 30)) * 0xbf58476d1ce4e5b9;
        x = (x ^ (x >> 27)) * 0x94d049bb133111eb;
        return x ^ (x >> 31);
    }

    size_t operator()(uint64_t x) const {
        static const uint64_t FIXED_RANDOM = chrono::steady_clock::now().time_since_epoch().count();
        return splitmix64(x + FIXED_RANDOM);
    }
};
unordered_map<long long, int, custom_hash> safe_map;
*/
//list<int> l;

string r;
//char r[222253];
//deque<int> de;
//srand((int)time(NULL));
/*bool as(P a,P b)
{
    if(a.x!=b.x)
    return a.x<b.x;
    return a.y<b.y;
}*/

bool as(P a,P b)
{
    if(a.x!=b.x)
        return a.x<b.x;
    return a.y<b.y;
}

int f(int n,int m)
{
    printf("? %d %d\n",n,m);
    fflush(stdout);
    int p;
    scanf("%d",&p);
    return p;
}

int main()
{
    scanf("%d %d",&a,&b);
    for(int t=1;t<=a;t++)
    {
        n=m=0;
        n=m=f(1,t);
        for(int p=1;p<=30&&n==m;p++,m=f(1,t));
        if(n==a-b) o[t]=m;
        else o[t]=n;
    }
    o[0]=b;
    printf("! ");
    for(int t=1;t<=a;t++)
    {
        if(o[t]>o[t-1])
            printf("0");
        else printf("1");
    }
    printf("\n");
    fflush(stdout);
}


#include <bits/stdc++.h>
using namespace std;
//using lint = long long;

struct P
{
    int x,y;

    bool operator<(const P &a)const{
        if(x!=a.x)
              return x>a.x;
        return y>a.y;
    }

};

vector<int> v;

//bitset<4001000> b;
int i,n,d,m,k,a,b,c,h;

int o[311];
int l[311];
int j[331];
int e;

//int dx[10]={2,2,-2,-2,1,1,-1,-1},dy[10]={1,-1,1,-1,2,-2,2,-2};

int dx[10]={0,1,0,-1,1,1,-1,-1},dy[10]={1,0,-1,0,1,-1,1,-1},dz[10]={0,0,0,0,1,-1};
long long mod=998244353,mod2=1000000009,mod3=2017;
long long x,z,y;
double pi=3.14159265;
P u[3];
stack<int> s;
//set<int> s[222][22];
//priority_queue<P> q;
queue<int> q;
//2147483647
//'1'==49;
//'A'==65;
//'a'==97;
//unordered_
//map<int,int> p;
/*
struct custom_hash {
    static uint64_t splitmix64(uint64_t x) {
        // http://xorshift.di.unimi.it/splitmix64.c
        x += 0x9e3779b97f4a7c15;
        x = (x ^ (x >> 30)) * 0xbf58476d1ce4e5b9;
        x = (x ^ (x >> 27)) * 0x94d049bb133111eb;
        return x ^ (x >> 31);
    }

    size_t operator()(uint64_t x) const {
        static const uint64_t FIXED_RANDOM = chrono::steady_clock::now().time_since_epoch().count();
        return splitmix64(x + FIXED_RANDOM);
    }
};
unordered_map<long long, int, custom_hash> safe_map;
*/
//list<int> l;
//srand((int)time(NULL));
string r;
//char r[222253];
//deque<int> de;

/*bool as(P a,P b)
{
    if(a.x!=b.x)
    return a.x<b.x;
    return a.y<b.y;
}*/

bool as(P a,P b)
{
    if(a.x!=b.x)
        return a.x<b.x;
    return a.y<b.y;
}

int f(int n,int m,int u)
{
    //srand((int)time(NULL));

    /*if(u)
    for(int t=1;t<=m;t++)
        j[t]=1-j[t];
    else
        for(int t=n;t<=a;t++)
        j[t]=1-j[t];

    int q=0;
    for(int t=1;t<=a;t++)
    q+=j[t];
    printf("%d %d %d %d\n",n,m,u,q);
    return q;*/

    printf("? %d %d\n",n,m);
    fflush(stdout);
    int p;
    scanf("%d",&p);
    return p;
}

void g1()
{
    //srand((int)time(NULL));
    n=b;
    for(int t=1;t<=a;t++)
    {
        for(;(c=f(t,t,0))&&(((n-c)%2+2)%2!=t%2);)
        {
            //puts("#");
            for(int w=t;w<=a;l[w]++,w++);
            n=c;
        }
        int x=n,y=c;
        for(int w=1;w<t;w++)
            if((l[w]+o[w])%2) x--;
            else y--;
        if((x>y&&l[t]%2==0)||(x<y&&l[t]%2)) o[t]=1;
        for(int w=1;w<=t;w++)
            l[w]++;
        n=c;
    }
}

void g2()
{
    //srand((int)time(NULL));
    if(a==1)
    {
        if(b) o[1]=1;
        return;
    }

    n=b;
    for(;(c=f(2,a,0))&&((n-c)%2+2)%2;)
    {
        for(int t=1;t<=a;t++)
            l[t]++;
        n=c;
    }
    if((n>(a-c)&&l[1]%2==0)||(n<(a-c)&&l[1]%2)) o[1]=1;
    for(int t=2;t<=a;t++)
        l[t]++;
    n=c;
    for(int t=2;t<=a;t++)
    {
        for(;(c=f(t-1,t,0))&&(((n-c)%2+2)%2!=t%2);)
        {
            //puts("#");
            for(int w=t-1;w<=a;l[w]++,w++);
            n=c;
        }
        int x=n,y=c;
        for(int w=1;w<t;w++)
            if((l[w]+o[w])%2) x--;
            else y--;
        if((x>y&&l[t]%2==0)||(x<y&&l[t]%2)) o[t]=1;
        for(int w=1;w<=t;w++)
            l[w]++;
        n=c;
    }

}

int main()
{
    /*cin>>r;
    for(int t=0;t<r.size();b+=j[t+1],t++)
        j[t+1]=r[t]-'0';
    a=r.size();*/
    scanf("%d %d",&a,&b);
    if(a==b)
    {
        for(int t=1;t<=a;o[t]=1,t++);
    }
    else if(b==0)
    {
        ;
    }
    else if(a%2) g2();
    else g1();
    printf("! ");
    for(int t=1;t<=a;t++)
        printf("%d",o[t]);
    puts("");
    fflush(stdout);
}


#include <bits/stdc++.h>
using namespace std;
//using lint = long long;

struct P
{
    int x,y;

    bool operator<(const P &a)const{
        if(x!=a.x)
              return x>a.x;
        return y>a.y;
    }

};

vector<int> v;

//bitset<4001000> b;
int i,n,d,m,k,a,b,c,h;

int o[311];
int l[311];
int j[331];
int e;

//int dx[10]={2,2,-2,-2,1,1,-1,-1},dy[10]={1,-1,1,-1,2,-2,2,-2};

int dx[10]={0,1,0,-1,1,1,-1,-1},dy[10]={1,0,-1,0,1,-1,1,-1},dz[10]={0,0,0,0,1,-1};
long long mod=998244353,mod2=1000000009,mod3=2017;
long long x,z,y;
double pi=3.14159265;
P u[3];
stack<int> s;
//set<int> s[222][22];
//priority_queue<P> q;
queue<int> q;
//2147483647
//'1'==49;
//'A'==65;
//'a'==97;
//unordered_
//map<int,int> p;
/*
struct custom_hash {
    static uint64_t splitmix64(uint64_t x) {
        // http://xorshift.di.unimi.it/splitmix64.c
        x += 0x9e3779b97f4a7c15;
        x = (x ^ (x >> 30)) * 0xbf58476d1ce4e5b9;
        x = (x ^ (x >> 27)) * 0x94d049bb133111eb;
        return x ^ (x >> 31);
    }

    size_t operator()(uint64_t x) const {
        static const uint64_t FIXED_RANDOM = chrono::steady_clock::now().time_since_epoch().count();
        return splitmix64(x + FIXED_RANDOM);
    }
};
unordered_map<long long, int, custom_hash> safe_map;
*/
//list<int> l;
//srand((int)time(NULL));
string r;
//char r[222253];
//deque<int> de;

/*bool as(P a,P b)
{
    if(a.x!=b.x)
    return a.x<b.x;
    return a.y<b.y;
}*/

bool as(P a,P b)
{
    if(a.x!=b.x)
        return a.x<b.x;
    return a.y<b.y;
}

int f(int n,int m,int u)
{
    //srand((int)time(NULL));

    /*if(u)
    for(int t=1;t<=m;t++)
        j[t]=1-j[t];
    else
        for(int t=n;t<=a;t++)
        j[t]=1-j[t];

    int q=0;
    for(int t=1;t<=a;t++)
    q+=j[t];
    printf("%d %d %d %d\n",n,m,u,q);
    return q;*/

    printf("? %d %d\n",n,m);
    fflush(stdout);
    int p;
    scanf("%d",&p);
    return p;
}

void g1()
{
    //srand((int)time(NULL));
    n=b;
    for(int t=1;t<=a;t++)
    {
        for(;(c=f(t,t,0))&&(((n-c)%2+2)%2!=t%2);)
        {
            //puts("#");
            for(int w=t;w<=a;l[w]++,w++);
            n=c;
        }
        int x=n,y=c;
        for(int w=1;w<t;w++)
            if((l[w]+o[w])%2) x--;
            else y--;
        if((x>y&&l[t]%2==0)||(x<y&&l[t]%2)) o[t]=1;
        for(int w=1;w<=t;w++)
            l[w]++;
        n=c;
    }
}

void g2()
{
    //srand((int)time(NULL));
    if(a==1)
    {
        if(b) o[1]=1;
        return;
    }

    n=b;
    for(;(c=f(2,a,0))&&((n-c)%2+2)%2;)
    {
        for(int t=1;t<=a;t++)
            l[t]++;
        n=c;
    }
    if((n>(a-c)&&l[1]%2==0)||(n<(a-c)&&l[1]%2)) o[1]=1;
    for(int t=2;t<=a;t++)
        l[t]++;
    n=c;
    for(int t=2;t<=a;t++)
    {
        for(;(c=f(t-1,t,0))&&(((n-c)%2+2)%2!=t%2);)
        {
            //puts("#");
            for(int w=t-1;w<=a;l[w]++,w++);
            n=c;
        }
        int x=n,y=c;
        for(int w=1;w<t;w++)
            if((l[w]+o[w])%2) x--;
            else y--;
        if((x>y&&l[t]%2==0)||(x<y&&l[t]%2==1)) o[t]=1;
        for(int w=1;w<=t;w++)
            l[w]++;
        n=c;
    }

}

int main()
{
    /*cin>>r;
    for(int t=0;t<r.size();b+=j[t+1],t++)
        j[t+1]=r[t]-'0';
    a=r.size();*/
    scanf("%d %d",&a,&b);
    if(a==b)
    {
        for(int t=1;t<=a;o[t]=1,t++);
    }
    else if(b==0)
    {
        ;
    }
    else if(a%2) g2();
    else g1();
    printf("! ");
    for(int t=1;t<=a;t++)
        printf("%d",o[t]);
    puts("");
    fflush(stdout);
}


#include <bits/stdc++.h>
using namespace std;
//using lint = long long;

struct P
{
    int x,y;

    bool operator<(const P &a)const{
        if(x!=a.x)
              return x>a.x;
        return y>a.y;
    }

};

vector<long long> v[11];

//bitset<4001000> b;
int i,n,d,m,k,a,b,c,h;

int o[311];
int l[11];
int j[1];
int e;

//int dx[10]={2,2,-2,-2,1,1,-1,-1},dy[10]={1,-1,1,-1,2,-2,2,-2};

int dx[10]={0,1,0,-1,1,1,-1,-1},dy[10]={1,0,-1,0,1,-1,1,-1},dz[10]={0,0,0,0,1,-1};
long long mod=998244353,mod2=1000000009,mod3=2017;
long long x,z,y;
double pi=3.14159265;
P u[3];
stack<long long> s;
//set<int> s[222][22];
//priority_queue<P> q;
//queue<int> q;
//2147483647
//'1'==49;
//'A'==65;
//'a'==97;
//unordered_
//map<int,int> p;
/*
struct custom_hash {
    static uint64_t splitmix64(uint64_t x) {
        // http://xorshift.di.unimi.it/splitmix64.c
        x += 0x9e3779b97f4a7c15;
        x = (x ^ (x >> 30)) * 0xbf58476d1ce4e5b9;
        x = (x ^ (x >> 27)) * 0x94d049bb133111eb;
        return x ^ (x >> 31);
    }

    size_t operator()(uint64_t x) const {
        static const uint64_t FIXED_RANDOM = chrono::steady_clock::now().time_since_epoch().count();
        return splitmix64(x + FIXED_RANDOM);
    }
};
unordered_map<long long, int, custom_hash> safe_map;
*/
//list<int> l;

string r;
//char r[222253];
//deque<int> de;
//srand((int)time(NULL));
/*bool as(P a,P b)
{
    if(a.x!=b.x)
    return a.x<b.x;
    return a.y<b.y;
}*/

bool as(P a,P b)
{
    if(a.x!=b.x)
        return a.x<b.x;
    return a.y<b.y;
}

int f(int n,int m)
{
    printf("? %d %d\n",n,m);
    fflush(stdout);
    int p;
    scanf("%d",&p);
    return p;
}

int main()
{
    scanf("%d %d",&a,&b);
    for(int t=1;t<=a;t++)
    {
        n=m=0;
        n=m=f(1,t);
        for(int p=1;p<=30&&n!=m;p++,m=f(1,t));
        if(n==a-b) o[t]=m;
        else o[t]=n;
    }
    o[0]=b;
    printf("! ");
    for(int t=1;t<=a;t++)
    {
        if(o[t]>o[t-1])
            printf("0");
        else printf("1");
    }
    printf("\n");
    fflush(stdout);
}


#include <bits/stdc++.h>
using namespace std;
//using lint = long long;

struct P
{
    int x,y;

    bool operator<(const P &a)const{
        if(x!=a.x)
              return x>a.x;
        return y>a.y;
    }

};

vector<int> v;

//bitset<4001000> b;
int i,n,d,m,k,a,b,c,h;

int o[311];
int l[311];
int j[331];
int e;

//int dx[10]={2,2,-2,-2,1,1,-1,-1},dy[10]={1,-1,1,-1,2,-2,2,-2};

int dx[10]={0,1,0,-1,1,1,-1,-1},dy[10]={1,0,-1,0,1,-1,1,-1},dz[10]={0,0,0,0,1,-1};
long long mod=998244353,mod2=1000000009,mod3=2017;
long long x,z,y;
double pi=3.14159265;
P u[3];
stack<int> s;
//set<int> s[222][22];
//priority_queue<P> q;
queue<int> q;
//2147483647
//'1'==49;
//'A'==65;
//'a'==97;
//unordered_
//map<int,int> p;
/*
struct custom_hash {
    static uint64_t splitmix64(uint64_t x) {
        // http://xorshift.di.unimi.it/splitmix64.c
        x += 0x9e3779b97f4a7c15;
        x = (x ^ (x >> 30)) * 0xbf58476d1ce4e5b9;
        x = (x ^ (x >> 27)) * 0x94d049bb133111eb;
        return x ^ (x >> 31);
    }

    size_t operator()(uint64_t x) const {
        static const uint64_t FIXED_RANDOM = chrono::steady_clock::now().time_since_epoch().count();
        return splitmix64(x + FIXED_RANDOM);
    }
};
unordered_map<long long, int, custom_hash> safe_map;
*/
//list<int> l;
//srand((int)time(NULL));
string r;
//char r[222253];
//deque<int> de;

/*bool as(P a,P b)
{
    if(a.x!=b.x)
    return a.x<b.x;
    return a.y<b.y;
}*/

bool as(P a,P b)
{
    if(a.x!=b.x)
        return a.x<b.x;
    return a.y<b.y;
}

int f(int n,int m)
{
    /*if(u)
    for(int t=1;t<=n;t++)
        j[t]=1-j[t];
    else
        for(int t=m;t<=a;t++)
        j[t]=1-j[t];
    printf("%d %d %d\n",n,m,u);
    int q=0;
    for(int t=1;t<=a;t++)
    q+=j[t];
    return q;
*/
    printf("? %d %d\n",n,m);
    fflush(stdout);
    int p;
    scanf("%d",&p);
    return p;
}

void g1()
{
    //srand((int)time(NULL));
    n=b;
    for(int t=1;t<=a;t++)
    {
        for(;(c=f(t,t))&&(((n-c)%2+2)%2!=t%2);)
        {
            //puts("#");
            for(int w=t;w<=a;l[w]++,w++);
            n=c;
        }
        int x=n,y=c;
        for(int w=1;w<t;w++)
            if((l[w]+o[w])%2) x--;
            else y--;
        if((x>y&&l[t]%2==0)||(x<y&&l[t]%2)) o[t]=1;
        for(int w=1;w<=t;w++)
            l[w]++;
        n=c;
    }
}

void g2()
{
    if(a==1)
    {
        if(b) o[1]=1;
        return;
    }

    n=b;
    for(;(c=f(2,a-2))&&((n-c)%2+2)%2;)
    {
        for(int t=1;t<a-1;t++)
            l[t]++;
        n=c;
    }
    if((n>(a-c)&&l[1]%2==0)||(n<(a-c)&&l[1]%2)) o[1]=1;
    for(int t=2;t<=a;t++)
        l[t]++;
    n=c;
    for(int t=2;t<=a;t++)
    {
        for(;(c=f(t-1,t))&&(((n-c)%2+2)%2!=t%2);)
        {
            for(int w=t-1;w<=a;l[w]++,w++);
            n=c;
        }
        int x=n,y=c;
        for(int w=1;w<t;w++)
            if((l[w]+o[w])%2) x--;
            else y--;
        if(((x==y+1)&&(l[t]%2==0))||((x+1==y)&&(l[t]%2))) o[t]=1;
        for(int w=1;w<=t;w++)
            l[w]++;
        n=c;
    }

}

int main()
{
    /*cin>>r;
    for(int t=0;t<r.size();b+=j[t+1],t++)
        j[t+1]=r[t]-'0';
    a=r.size();*/
    scanf("%d %d",&a,&b);
    if(a%2) g2();
    else g1();
    printf("! ");
    for(int t=1;t<=a;t++)
        printf("%d",o[t]);
    puts("");
    fflush(stdout);
}


#include <bits/stdc++.h>
using namespace std;
//using lint = long long;

struct P
{
    int x,y;

    bool operator<(const P &a)const{
        if(x!=a.x)
              return x>a.x;
        return y>a.y;
    }

};

vector<int> v;

//bitset<4001000> b;
int i,n,d,m,k,a,b,c,h;

int o[311];
int l[311];
int j[331];
int e;

//int dx[10]={2,2,-2,-2,1,1,-1,-1},dy[10]={1,-1,1,-1,2,-2,2,-2};

int dx[10]={0,1,0,-1,1,1,-1,-1},dy[10]={1,0,-1,0,1,-1,1,-1},dz[10]={0,0,0,0,1,-1};
long long mod=998244353,mod2=1000000009,mod3=2017;
long long x,z,y;
double pi=3.14159265;
P u[3];
stack<int> s;
//set<int> s[222][22];
//priority_queue<P> q;
queue<int> q;
//2147483647
//'1'==49;
//'A'==65;
//'a'==97;
//unordered_
//map<int,int> p;
/*
struct custom_hash {
    static uint64_t splitmix64(uint64_t x) {
        // http://xorshift.di.unimi.it/splitmix64.c
        x += 0x9e3779b97f4a7c15;
        x = (x ^ (x >> 30)) * 0xbf58476d1ce4e5b9;
        x = (x ^ (x >> 27)) * 0x94d049bb133111eb;
        return x ^ (x >> 31);
    }

    size_t operator()(uint64_t x) const {
        static const uint64_t FIXED_RANDOM = chrono::steady_clock::now().time_since_epoch().count();
        return splitmix64(x + FIXED_RANDOM);
    }
};
unordered_map<long long, int, custom_hash> safe_map;
*/
//list<int> l;
//srand((int)time(NULL));
string r;
//char r[222253];
//deque<int> de;

/*bool as(P a,P b)
{
    if(a.x!=b.x)
    return a.x<b.x;
    return a.y<b.y;
}*/

bool as(P a,P b)
{
    if(a.x!=b.x)
        return a.x<b.x;
    return a.y<b.y;
}

int f(int n,int m)
{
    /*if(u)
    for(int t=1;t<=n;t++)
        j[t]=1-j[t];
    else
        for(int t=m;t<=a;t++)
        j[t]=1-j[t];
    printf("%d %d %d\n",n,m,u);
    int q=0;
    for(int t=1;t<=a;t++)
    q+=j[t];
    return q;
*/
    printf("? %d %d\n",n,m);
    fflush(stdout);
    int p;
    scanf("%d",&p);
    return p;
}

void g1()
{
    //srand((int)time(NULL));
    n=b;
    for(int t=1;t<=a;t++)
    {
        for(;(c=f(t,t))&&(((n-c)%2+2)%2!=t%2);)
        {
            //puts("#");
            for(int w=t;w<=a;l[w]++,w++);
            n=c;
        }
        int x=n,y=c;
        for(int w=1;w<t;w++)
            if((l[w]+o[w])%2) x--;
            else y--;
        if((x>y&&l[t]%2==0)||(x<y&&l[t]%2)) o[t]=1;
        for(int w=1;w<=t;w++)
            l[w]++;
        n=c;
    }
}

void g2()
{
    if(a==1)
    {
        if(b) o[1]=1;
        return;
    }

    n=b;
    for(;(c=f(2,a))&&((n-c)%2+2)%2;)
    {
        for(int t=1;t<=a;t++)
            l[t]++;
        n=c;
    }
    if((n>(a-c)&&l[1]%2==0)||(n<(a-c)&&l[1]%2)) o[1]=1;
    for(int t=2;t<=a;t++)
        l[t]++;
    n=c;
    for(int t=2;t<=a;t++)
    {
        for(;(c=f(t-1,t))&&(((n-c)%2+2)%2!=t%2);)
        {
            for(int w=t-1;w<=a;l[w]++,w++);
            n=c;
        }
        int x=n,y=c;
        for(int w=1;w<t;w++)
            if((l[w]+o[w])%2) x--;
            else y--;
        if(((x==y+1)&&(l[t]%2==0))||((x+1==y)&&(l[t]%2))) o[t]=1;
        for(int w=1;w<=t;w++)
            l[w]++;
        n=c;
    }

}

int main()
{
    /*cin>>r;
    for(int t=0;t<r.size();b+=j[t+1],t++)
        j[t+1]=r[t]-'0';
    a=r.size();*/
    scanf("%d %d",&a,&b);
    if(a==b)
    {
        for(int t=1;t<=a;o[t]=1,t++);
    }
    else if(b==0)
    {
        ;
    }
    else if(a%2) g2();
    else g1();
    printf("! ");
    for(int t=1;t<=a;t++)
        printf("%d",o[t]);
    puts("");
    fflush(stdout);
}


#include <bits/stdc++.h>
using namespace std;
//using lint = long long;

struct P
{
    int x,y;

    bool operator<(const P &a)const{
        if(x!=a.x)
              return x>a.x;
        return y>a.y;
    }

};

vector<long long> v[11];

//bitset<4001000> b;
int i,n,d,m,k,a,b,c,h;

int o[311];
int l[11];
int j[1];
int e;

//int dx[10]={2,2,-2,-2,1,1,-1,-1},dy[10]={1,-1,1,-1,2,-2,2,-2};

int dx[10]={0,1,0,-1,1,1,-1,-1},dy[10]={1,0,-1,0,1,-1,1,-1},dz[10]={0,0,0,0,1,-1};
long long mod=998244353,mod2=1000000009,mod3=2017;
long long x,z,y;
double pi=3.14159265;
P u[3];
stack<long long> s;
//set<int> s[222][22];
//priority_queue<P> q;
//queue<int> q;
//2147483647
//'1'==49;
//'A'==65;
//'a'==97;
//unordered_
//map<int,int> p;
/*
struct custom_hash {
    static uint64_t splitmix64(uint64_t x) {
        // http://xorshift.di.unimi.it/splitmix64.c
        x += 0x9e3779b97f4a7c15;
        x = (x ^ (x >> 30)) * 0xbf58476d1ce4e5b9;
        x = (x ^ (x >> 27)) * 0x94d049bb133111eb;
        return x ^ (x >> 31);
    }

    size_t operator()(uint64_t x) const {
        static const uint64_t FIXED_RANDOM = chrono::steady_clock::now().time_since_epoch().count();
        return splitmix64(x + FIXED_RANDOM);
    }
};
unordered_map<long long, int, custom_hash> safe_map;
*/
//list<int> l;

string r;
//char r[222253];
//deque<int> de;
//srand((int)time(NULL));
/*bool as(P a,P b)
{
    if(a.x!=b.x)
    return a.x<b.x;
    return a.y<b.y;
}*/

bool as(P a,P b)
{
    if(a.x!=b.x)
        return a.x<b.x;
    return a.y<b.y;
}

int f(int n,int m)
{
    printf("? %d %d\n",n,m);
    fflush(stdout);
    int p;
    scanf("%d",&p);
    return p;
}

int main()
{
    scanf("%d %d",&a,&b);
    for(int t=1;t<=a;t++)
    {
        n=f(1,t);
        for(int p=1;p<=30&&n==a-b;p++,n=f(1,t));
        //if(n==a-b) o[t]=m;
        //else
            o[t]=n;
    }
    o[0]=b;
    printf("! ");
    for(int t=1;t<=a;t++)
    {
        if(o[t]>o[t-1])
            printf("0");
        else printf("1");
    }
    printf("\n");
    fflush(stdout);
}


#include <bits/stdc++.h>
using namespace std;
//using lint = long long;

struct P
{
    int x,y;

    bool operator<(const P &a)const{
        if(x!=a.x)
              return x>a.x;
        return y>a.y;
    }

};

vector<int> v;

//bitset<4001000> b;
int i,n,d,m,k,a,b,c,h;

int o[311];
int l[311];
int j[1];
int e;

//int dx[10]={2,2,-2,-2,1,1,-1,-1},dy[10]={1,-1,1,-1,2,-2,2,-2};

int dx[10]={0,1,0,-1,1,1,-1,-1},dy[10]={1,0,-1,0,1,-1,1,-1},dz[10]={0,0,0,0,1,-1};
long long mod=998244353,mod2=1000000009,mod3=2017;
long long x,z,y;
double pi=3.14159265;
P u[3];
stack<int> s;
//set<int> s[222][22];
//priority_queue<P> q;
queue<int> q;
//2147483647
//'1'==49;
//'A'==65;
//'a'==97;
//unordered_
//map<int,int> p;
/*
struct custom_hash {
    static uint64_t splitmix64(uint64_t x) {
        // http://xorshift.di.unimi.it/splitmix64.c
        x += 0x9e3779b97f4a7c15;
        x = (x ^ (x >> 30)) * 0xbf58476d1ce4e5b9;
        x = (x ^ (x >> 27)) * 0x94d049bb133111eb;
        return x ^ (x >> 31);
    }

    size_t operator()(uint64_t x) const {
        static const uint64_t FIXED_RANDOM = chrono::steady_clock::now().time_since_epoch().count();
        return splitmix64(x + FIXED_RANDOM);
    }
};
unordered_map<long long, int, custom_hash> safe_map;
*/
//list<int> l;

string r;
//char r[222253];
//deque<int> de;
//srand((int)time(NULL));
/*bool as(P a,P b)
{
    if(a.x!=b.x)
    return a.x<b.x;
    return a.y<b.y;
}*/

bool as(P a,P b)
{
    if(a.x!=b.x)
        return a.x<b.x;
    return a.y<b.y;
}

int f(int n,int m)
{
    printf("? %d %d\n",n,m);
    fflush(stdout);
    int p;
    scanf("%d",&p);
    return p;
}

void g1()
{
    n=b;
    for(int t=1;t<=a;t++)
    {
        for(;(c=f(t,t))&&(((n-c)%2+2)%2!=t%2);)
        {
            for(int w=t;w<=a;l[w]++,w++);
            n=c;
        }
        int x=n,y=c;
        for(int w=1;w<t;w++)
            if((l[w]+o[w])%2) x--;
            else y--;
        if((x>y&&l[t]%2==0)||(x<y&&l[t]%2)) o[t]=1;
        for(int w=1;w<=t;w++)
            l[w]++;
        n=c;
    }
}

void g2()
{
    /*n=b;
    for(int t=1;t<a;t++)
    {
        c=f(t,t+1);
        m=((n-c)%2+2)%2;
        if(m%2==t%2)
        {
            int x=0,y=0;
            for(int w=1;w<t;w++)
            {
                if((o[w]+l[w])%2) x++;
                else y++;
            }
            if((x-y<n-c&&(l[t])%2==0)||(x-y>n-c&&l[t]%2))
            {
                //printf("%d %d %d %d %d\n",x,y,n,c,t);
                o[t]=1;
            }
            for(int w=1;w<=t;w++)
                l[w]++;
        }
        else
        {
            //puts("#");
            int x=(n+c-(a-t))/2;
            for(int w=1;w<t;w++)
                if((o[w]+l[w])%2) x--;
            if((x&&l[t]%2==0)||(x==0&&l[t]%2)) o[t]=1;

            for(int w=t+1;w<=a;w++)
                l[w]++;

        }

        n=c;
    }

    for(int t=1;t<a;t++)
        d+=o[t];

    if(d==b) o[a]=0;
    else o[a]=1;*/

    puts("#");

    n=b;
    for(int t=1;t<a;t++)
    {
        for(;(c=f(t,t+1))&&(((n-c)%2+2)%2!=t%2);)
        {
            for(int w=t+1;w<=a;l[w]++,w++);
            n=c;
        }
        int x=n,y=c;
        for(int w=1;w<t;w++)
            if((l[w]+o[w])%2) x--;
            else y--;
        if(((x==y+1)&&(l[t]%2==0))||((x+1==y)&&(l[t]%2))) o[t]=1;
        for(int w=1;w<=t;w++)
            l[w]++;
        n=c;
    }
    int x=0;
    for(int t=1;t<a;t++) x+=o[t];
    if(x<b) o[a]=1;
}

int main()
{
    scanf("%d %d",&a,&b);
    if(a%2) g2();
    else g1();
    printf("! ");
    for(int t=1;t<=a;t++)
        printf("%d",o[t]);
    puts("");
    fflush(stdout);
}


#include <bits/stdc++.h>
using namespace std;
//using lint = long long;

struct P
{
    int x,y;

    bool operator<(const P &a)const{
        if(x!=a.x)
              return x>a.x;
        return y>a.y;
    }

};

vector<int> v;

//bitset<4001000> b;
int i,n,d,m,k,a,b,c,h;

int o[311];
int l[311];
int j[1];
int e;

//int dx[10]={2,2,-2,-2,1,1,-1,-1},dy[10]={1,-1,1,-1,2,-2,2,-2};

int dx[10]={0,1,0,-1,1,1,-1,-1},dy[10]={1,0,-1,0,1,-1,1,-1},dz[10]={0,0,0,0,1,-1};
long long mod=998244353,mod2=1000000009,mod3=2017;
long long x,z,y;
double pi=3.14159265;
P u[3];
stack<int> s;
//set<int> s[222][22];
//priority_queue<P> q;
queue<int> q;
//2147483647
//'1'==49;
//'A'==65;
//'a'==97;
//unordered_
//map<int,int> p;
/*
struct custom_hash {
    static uint64_t splitmix64(uint64_t x) {
        // http://xorshift.di.unimi.it/splitmix64.c
        x += 0x9e3779b97f4a7c15;
        x = (x ^ (x >> 30)) * 0xbf58476d1ce4e5b9;
        x = (x ^ (x >> 27)) * 0x94d049bb133111eb;
        return x ^ (x >> 31);
    }

    size_t operator()(uint64_t x) const {
        static const uint64_t FIXED_RANDOM = chrono::steady_clock::now().time_since_epoch().count();
        return splitmix64(x + FIXED_RANDOM);
    }
};
unordered_map<long long, int, custom_hash> safe_map;
*/
//list<int> l;

string r;
//char r[222253];
//deque<int> de;
//srand((int)time(NULL));
/*bool as(P a,P b)
{
    if(a.x!=b.x)
    return a.x<b.x;
    return a.y<b.y;
}*/

bool as(P a,P b)
{
    if(a.x!=b.x)
        return a.x<b.x;
    return a.y<b.y;
}

int f(int n,int m)
{
    printf("? %d %d\n",n,m);
    fflush(stdout);
    int p;
    scanf("%d",&p);
    return p;
}

void g1()
{
    n=b;
    for(int t=1;t<=a;t++)
    {
        for(;c=f(t,t),((n-c)%2+2)%2!=t%2;)
        {
            for(int w=t;w<=a;l[w]++,w++);
            n=c;
        }
        int x=n,y=c;
        for(int w=1;w<t;w++)
            if((l[w]+o[w])%2) x--;
            else y--;
        if((x>y&&l[t]%2==0)||(x<y&&l[t]%2)) o[t]=1;
        for(int w=1;w<=t;w++)
            l[w]++;
        n=c;
    }
}

void g2()
{
    /*n=b;
    for(int t=1;t<a;t++)
    {
        c=f(t,t+1);
        m=((n-c)%2+2)%2;
        if(m%2==t%2)
        {
            int x=0,y=0;
            for(int w=1;w<t;w++)
            {
                if((o[w]+l[w])%2) x++;
                else y++;
            }
            if((x-y<n-c&&(l[t])%2==0)||(x-y>n-c&&l[t]%2))
            {
                //printf("%d %d %d %d %d\n",x,y,n,c,t);
                o[t]=1;
            }
            for(int w=1;w<=t;w++)
                l[w]++;
        }
        else
        {
            //puts("#");
            int x=(n+c-(a-t))/2;
            for(int w=1;w<t;w++)
                if((o[w]+l[w])%2) x--;
            if((x&&l[t]%2==0)||(x==0&&l[t]%2)) o[t]=1;

            for(int w=t+1;w<=a;w++)
                l[w]++;

        }

        n=c;
    }

    for(int t=1;t<a;t++)
        d+=o[t];

    if(d==b) o[a]=0;
    else o[a]=1;*/

    n=b;
    for(int t=1;t<a;t++)
    {
        for(;c=f(t,t+1),((n-c)%2+2)%2!=t%2;)
        {
            for(int w=t+1;w<=a;l[w]++,w++);
            n=c;
        }
        int x=n,y=c;
        for(int w=1;w<t;w++)
            if((l[w]+o[w])%2) x--;
            else y--;
        if((x<y&&l[t]%2==0)||(x>y&&l[t]%2)) o[t]=1;
        for(int w=1;w<=t;w++)
            l[w]++;
        n=c;
    }
    int x=0;
    for(int t=1;t<a;t++) x+=o[t];
    if(x==b) o[a]=1;
}

int main()
{
    scanf("%d %d",&a,&b);
    if(a%2) g2();
    else g1();
    printf("! ");
    for(int t=1;t<=a;t++)
        printf("%d",o[t]);
    puts("");
    fflush(stdout);
}


#include <bits/stdc++.h>
using namespace std;
//using lint = long long;

struct P
{
    int x,y;

    bool operator<(const P &a)const{
        if(x!=a.x)
              return x>a.x;
        return y>a.y;
    }

};

vector<int> v;

//bitset<4001000> b;
int i,n,d,m,k,a,b,c,h;

int o[311];
int l[311];
int j[1];
int e;

//int dx[10]={2,2,-2,-2,1,1,-1,-1},dy[10]={1,-1,1,-1,2,-2,2,-2};

int dx[10]={0,1,0,-1,1,1,-1,-1},dy[10]={1,0,-1,0,1,-1,1,-1},dz[10]={0,0,0,0,1,-1};
long long mod=998244353,mod2=1000000009,mod3=2017;
long long x,z,y;
double pi=3.14159265;
P u[3];
stack<int> s;
//set<int> s[222][22];
//priority_queue<P> q;
queue<int> q;
//2147483647
//'1'==49;
//'A'==65;
//'a'==97;
//unordered_
//map<int,int> p;
/*
struct custom_hash {
    static uint64_t splitmix64(uint64_t x) {
        // http://xorshift.di.unimi.it/splitmix64.c
        x += 0x9e3779b97f4a7c15;
        x = (x ^ (x >> 30)) * 0xbf58476d1ce4e5b9;
        x = (x ^ (x >> 27)) * 0x94d049bb133111eb;
        return x ^ (x >> 31);
    }

    size_t operator()(uint64_t x) const {
        static const uint64_t FIXED_RANDOM = chrono::steady_clock::now().time_since_epoch().count();
        return splitmix64(x + FIXED_RANDOM);
    }
};
unordered_map<long long, int, custom_hash> safe_map;
*/
//list<int> l;

string r;
//char r[222253];
//deque<int> de;
//srand((int)time(NULL));
/*bool as(P a,P b)
{
    if(a.x!=b.x)
    return a.x<b.x;
    return a.y<b.y;
}*/

bool as(P a,P b)
{
    if(a.x!=b.x)
        return a.x<b.x;
    return a.y<b.y;
}

int f(int n,int m)
{
    printf("? %d %d\n",n,m);
    fflush(stdout);
    int p;
    scanf("%d",&p);
    return p;
}

void g1()
{
    n=b;
    for(int t=1;t<=a;t++)
    {
        for(;(c=f(t,t))&&(((n-c)%2+2)%2!=t%2);)
        {
            for(int w=t;w<=a;l[w]++,w++);
            n=c;
        }
        int x=n,y=c;
        for(int w=1;w<t;w++)
            if((l[w]+o[w])%2) x--;
            else y--;
        if((x>y&&l[t]%2==0)||(x<y&&l[t]%2)) o[t]=1;
        for(int w=1;w<=t;w++)
            l[w]++;
        n=c;
    }
}

void g2()
{
    /*n=b;
    for(int t=1;t<a;t++)
    {
        c=f(t,t+1);
        m=((n-c)%2+2)%2;
        if(m%2==t%2)
        {
            int x=0,y=0;
            for(int w=1;w<t;w++)
            {
                if((o[w]+l[w])%2) x++;
                else y++;
            }
            if((x-y<n-c&&(l[t])%2==0)||(x-y>n-c&&l[t]%2))
            {
                //printf("%d %d %d %d %d\n",x,y,n,c,t);
                o[t]=1;
            }
            for(int w=1;w<=t;w++)
                l[w]++;
        }
        else
        {
            //puts("#");
            int x=(n+c-(a-t))/2;
            for(int w=1;w<t;w++)
                if((o[w]+l[w])%2) x--;
            if((x&&l[t]%2==0)||(x==0&&l[t]%2)) o[t]=1;

            for(int w=t+1;w<=a;w++)
                l[w]++;

        }

        n=c;
    }

    for(int t=1;t<a;t++)
        d+=o[t];

    if(d==b) o[a]=0;
    else o[a]=1;*/

    n=b;
    for(int t=1;t<a;t++)
    {
        for(;(c=f(t,t+1))&&(((n-c)%2+2)%2!=t%2);)
        {
            for(int w=t+1;w<=a;l[w]++,w++);
            n=c;
        }
        int x=n,y=c;
        for(int w=1;w<t;w++)
            if((l[w]+o[w])%2) x--;
            else y--;
        if(((x>y)&&(l[t]%2==0))||((x<y)&&(l[t]%2))) o[t]=1;
        for(int w=1;w<=t;w++)
            l[w]++;
        n=c;
    }
    int x=0;
    for(int t=1;t<a;t++) x+=o[t];
    if(x<b) o[a]=1;
}

int main()
{
    scanf("%d %d",&a,&b);
    if(a%2) g2();
    else g1();
    printf("! ");
    for(int t=1;t<=a;t++)
        printf("%d",o[t]);
    puts("");
    fflush(stdout);
}


#include <bits/stdc++.h>
using namespace std;
//using lint = long long;

struct P
{
    int x,y;

    bool operator<(const P &a)const{
        if(x!=a.x)
              return x>a.x;
        return y>a.y;
    }

};

vector<int> v;

//bitset<4001000> b;
int i,n,d,m,k,a,b,c,h;

int o[311];
int l[311];
int j[331];
int e;

//int dx[10]={2,2,-2,-2,1,1,-1,-1},dy[10]={1,-1,1,-1,2,-2,2,-2};

int dx[10]={0,1,0,-1,1,1,-1,-1},dy[10]={1,0,-1,0,1,-1,1,-1},dz[10]={0,0,0,0,1,-1};
long long mod=998244353,mod2=1000000009,mod3=2017;
long long x,z,y;
double pi=3.14159265;
P u[3];
stack<int> s;
//set<int> s[222][22];
//priority_queue<P> q;
queue<int> q;
//2147483647
//'1'==49;
//'A'==65;
//'a'==97;
//unordered_
//map<int,int> p;
/*
struct custom_hash {
    static uint64_t splitmix64(uint64_t x) {
        // http://xorshift.di.unimi.it/splitmix64.c
        x += 0x9e3779b97f4a7c15;
        x = (x ^ (x >> 30)) * 0xbf58476d1ce4e5b9;
        x = (x ^ (x >> 27)) * 0x94d049bb133111eb;
        return x ^ (x >> 31);
    }

    size_t operator()(uint64_t x) const {
        static const uint64_t FIXED_RANDOM = chrono::steady_clock::now().time_since_epoch().count();
        return splitmix64(x + FIXED_RANDOM);
    }
};
unordered_map<long long, int, custom_hash> safe_map;
*/
//list<int> l;
//srand((int)time(NULL));
string r;
//char r[222253];
//deque<int> de;

/*bool as(P a,P b)
{
    if(a.x!=b.x)
    return a.x<b.x;
    return a.y<b.y;
}*/

bool as(P a,P b)
{
    if(a.x!=b.x)
        return a.x<b.x;
    return a.y<b.y;
}

int f(int n,int m)
{
    /*if(u)
    for(int t=1;t<=n;t++)
        j[t]=1-j[t];
    else
        for(int t=m;t<=a;t++)
        j[t]=1-j[t];
    printf("%d %d %d\n",n,m,u);
    int q=0;
    for(int t=1;t<=a;t++)
    q+=j[t];
    return q;
*/
    printf("? %d %d\n",n,m);
    fflush(stdout);
    int p;
    scanf("%d",&p);
    return p;
}

void g1()
{
    //srand((int)time(NULL));
    n=b;
    for(int t=1;t<=a;t++)
    {
        for(;(c=f(t,t))&&(((n-c)%2+2)%2!=t%2);)
        {
            //puts("#");
            for(int w=t;w<=a;l[w]++,w++);
            n=c;
        }
        int x=n,y=c;
        for(int w=1;w<t;w++)
            if((l[w]+o[w])%2) x--;
            else y--;
        if((x>y&&l[t]%2==0)||(x<y&&l[t]%2)) o[t]=1;
        for(int w=1;w<=t;w++)
            l[w]++;
        n=c;
    }
}

void g2()
{
    if(a==1)
    {
        if(b) o[1]=1;
        return;
    }

    n=b;
    for(;(c=f(2,a))&&((n-c)%2+2)%2;)
    {
        for(int t=1;t<=a;t++)
            l[t]++;
        n=c;
    }
    if((n>(a-c)&&l[1]%2==0)||(n<(a-c)&&l[1]%2)) o[1]=1;
    for(int t=2;t<=a;t++)
        l[t]++;
    n=c;
    for(int t=2;t<=a;t++)
    {
        for(;(c=f(t-1,t))&&(((n-c)%2+2)%2!=t%2);)
        {
            for(int w=t-1;w<=a;l[w]++,w++);
            n=c;
        }
        int x=n,y=c;
        for(int w=1;w<t;w++)
            if((l[w]+o[w])%2) x--;
            else y--;
        if((x>y&&l[t]%2==0)||(x<y&&l[t]%2)) o[t]=1;
        for(int w=1;w<=t;w++)
            l[w]++;
        n=c;
    }

}

int main()
{
    /*cin>>r;
    for(int t=0;t<r.size();b+=j[t+1],t++)
        j[t+1]=r[t]-'0';
    a=r.size();*/
    scanf("%d %d",&a,&b);
    if(a==b)
    {
        for(int t=1;t<=a;o[t]=1,t++);
    }
    else if(b==0)
    {
        ;
    }
    else if(a%2) g2();
    else g1();
    printf("! ");
    for(int t=1;t<=a;t++)
        printf("%d",o[t]);
    puts("");
    fflush(stdout);
}


#include <bits/stdc++.h>
using namespace std;
//using lint = long long;

struct P
{
    int x,y;

    bool operator<(const P &a)const{
        if(x!=a.x)
              return x>a.x;
        return y>a.y;
    }

};

vector<int> v;

//bitset<4001000> b;
int i,n,d,m,k,a,b,c,h;

int o[311];
int l[311];
int j[331];
int e;

//int dx[10]={2,2,-2,-2,1,1,-1,-1},dy[10]={1,-1,1,-1,2,-2,2,-2};

int dx[10]={0,1,0,-1,1,1,-1,-1},dy[10]={1,0,-1,0,1,-1,1,-1},dz[10]={0,0,0,0,1,-1};
long long mod=998244353,mod2=1000000009,mod3=2017;
long long x,z,y;
double pi=3.14159265;
P u[3];
stack<int> s;
//set<int> s[222][22];
//priority_queue<P> q;
queue<int> q;
//2147483647
//'1'==49;
//'A'==65;
//'a'==97;
//unordered_
//map<int,int> p;
/*
struct custom_hash {
    static uint64_t splitmix64(uint64_t x) {
        // http://xorshift.di.unimi.it/splitmix64.c
        x += 0x9e3779b97f4a7c15;
        x = (x ^ (x >> 30)) * 0xbf58476d1ce4e5b9;
        x = (x ^ (x >> 27)) * 0x94d049bb133111eb;
        return x ^ (x >> 31);
    }

    size_t operator()(uint64_t x) const {
        static const uint64_t FIXED_RANDOM = chrono::steady_clock::now().time_since_epoch().count();
        return splitmix64(x + FIXED_RANDOM);
    }
};
unordered_map<long long, int, custom_hash> safe_map;
*/
//list<int> l;
//srand((int)time(NULL));
string r;
//char r[222253];
//deque<int> de;

/*bool as(P a,P b)
{
    if(a.x!=b.x)
    return a.x<b.x;
    return a.y<b.y;
}*/

bool as(P a,P b)
{
    if(a.x!=b.x)
        return a.x<b.x;
    return a.y<b.y;
}

int f(int n,int m)
{
    /*if(u)
    for(int t=1;t<=n;t++)
        j[t]=1-j[t];
    else
        for(int t=m;t<=a;t++)
        j[t]=1-j[t];
    printf("%d %d %d\n",n,m,u);
    int q=0;
    for(int t=1;t<=a;t++)
    q+=j[t];
    return q;
*/
    printf("? %d %d\n",n,m);
    fflush(stdout);
    int p;
    scanf("%d",&p);
    return p;
}

void g1()
{
    //srand((int)time(NULL));
    n=b;
    for(int t=1;t<=a;t++)
    {
        for(;(c=f(t,t))&&(((n-c)%2+2)%2!=t%2);)
        {
            //puts("#");
            for(int w=t;w<=a;l[w]++,w++);
            n=c;
        }
        int x=n,y=c;
        for(int w=1;w<t;w++)
            if((l[w]+o[w])%2) x--;
            else y--;
        if((x>y&&l[t]%2==0)||(x<y&&l[t]%2)) o[t]=1;
        for(int w=1;w<=t;w++)
            l[w]++;
        n=c;
    }
}

void g2()
{
    if(a==1)
    {
        if(b) o[1]=1;
        return;
    }

    n=b;
    for(;(c=f(2,a-2))&&((n-c)%2+2)%2;)
    {
        for(int t=1;t<a-1;t++)
            l[t]++;
        n=c;
    }
    if((n>(a-c)&&l[1]%2==0)||(n<(a-c)&&l[1]%2)) o[1]=1;
    for(int t=2;t<=a;t++)
        l[t]++;
    n=c;
    for(int t=2;t<=a;t++)
    {
        for(;(c=f(t-1,t))&&(((n-c)%2+2)%2!=t%2);)
        {
            for(int w=t-1;w<=a;l[w]++,w++);
            n=c;
        }
        int x=n,y=c;
        for(int w=1;w<t;w++)
            if((l[w]+o[w])%2) x--;
            else y--;
        if(((x==y+1)&&(l[t]%2==0))||((x+1==y)&&(l[t]%2))) o[t]=1;
        for(int w=1;w<=t;w++)
            l[w]++;
        n=c;
    }

}

int main()
{
    /*cin>>r;
    for(int t=0;t<r.size();b+=j[t+1],t++)
        j[t+1]=r[t]-'0';
    a=r.size();*/
    scanf("%d %d",&a,&b);
    if(a==b)
    {
        for(int t=1;t<=a;o[t]=1,t++);
    }
    else if(b==0)
    {
        ;
    }
    else if(a%2) g2();
    else g1();
    printf("! ");
    for(int t=1;t<=a;t++)
        printf("%d",o[t]);
    puts("");
    fflush(stdout);
}


#include<bits/stdc++.h>

using namespace std;

int N, T, ans[309];
const bool DBG = 0;
int hiddenString[309], aux[309], queryCount = 0;
const int maxQueryCount = 10000;

void init ()
{
    scanf ("%d %d", &N, &T);
    if (DBG)
    {
        srand (time (0));
        for (int i=1; i<=N; i++)
            hiddenString[i] = (i <= T);
        random_shuffle (hiddenString + 1, hiddenString + N + 1);
/*        for (int i=1; i<=N; i++)
            hiddenString[i] = i % 2;*/
        for (int i=1; i<=N; i++)
            aux[i] = hiddenString[i];
    }
}

int ask (int l, int r)
{
    queryCount ++;
    if (DBG)
    {
        int which = rand () & 1;
        if (which == 0) l = 1;
        else r = N;
        for (int i=l; i<=r; i++)
            aux[i] ^= 1;
        int ans = 0;
        for (int i=1; i<=N; i++)
            ans += aux[i];
        return ans;
    }
    printf ("? %d %d\n", l, r);
    fflush (stdout);
    int ans;
    scanf ("%d", &ans);
    if (ans == -1)
        assert (0);
    return ans;
}

void finish ()
{
    if (DBG)
    {
        for (int i=1; i<=N; i++)
            if (ans[i] != hiddenString[i])
            {
                printf ("WA\n");
                for (int j=1; j<=N; j++)
                    printf ("%d", ans[j]);
                printf ("\n");
                for (int j=1; j<=N; j++)
                    printf ("%d", hiddenString[j]);
                printf ("\n");
                exit (0);
            }
        printf ("OK %d\n", queryCount);
        for (int j=1; j<=N; j++)
            printf ("%d", ans[j]);
        printf ("\n");
        exit (0);
    }
    printf ("! ");
    for (int i=1; i<=N; i++)
        printf ("%d", ans[i]);
    printf ("\n");
    fflush (stdout);
    exit (0);
}

void solve ()
{
    int steps = maxQueryCount / N;
    if (steps % 2 == 1)
        steps --;
    int A = T, B = 0;
    bool xoredSuffix = 0;
    for (int i=N - 1; i>=1; i--)
    {
        int currAns = -1, oldValue = A + B, Y = N - i - 1;
        map < int, int > mp;
        mp[oldValue] = 1;
        for (int j=1; j<=steps; j++)
        {
            currAns = ask (1, i);
            if (j % 2 == 0)
            {
                mp[currAns] ++;
                if (mp.size () == 2)
                    break;
            }
        }
        int xoredValue = 0;
        if (mp.size () == 1) xoredValue = mp.begin () -> first;
        else
        {
            auto it = mp.begin ();
            if (it->first == oldValue) it ++;
            xoredValue = it->first;
        }
        int x1mx = xoredValue - (A + Y - B);
        if (x1mx == -1) ans[i + 1] = 1;
        else ans[i + 1] = 0;

        A -= ans[i + 1], B = currAns - A;
    }
    ans[1] = T;
    for (int i=2; i<=N; i++)
        ans[1] -= ans[i];
    finish ();
}

int main ()
{
//freopen ("input", "r", stdin);
//freopen ("output", "w", stdout);

init ();
solve ();

return 0;
}


#include <bits/stdc++.h>

using namespace std;

#define pb push_back
#define mp make_pair
#define fi first
#define se second
#define INF (1LL << 55)
#define MOD (1000 * 1000 * 1000 + 7)
#define maxn 311
#define maxq 10011

typedef long long ll;
typedef long double ld;
typedef pair<int, int> pii;

int st[maxq], ind;
int q[maxn];

bool ask(int l, int d){
	cout << "? " << l << " " << d << endl;
	cin >> st[++ind];
	return (st[ind] - st[ind - 1]) & 1;
}

int main(){
	int n;
	cin >> n >> st[0];
	q[n] = st[0];
	for(int i = 1; i < n; i++){
		int j = i - n % 2;

		if(j == 0){
			int state[2] = {0, 0}, before = st[ind];
			while(state[0] != 1 || state[1] != 0)
				state[ask(2, n)] ^= 1;

			int cur = st[ind];
			int len = n - 1;
			q[i] = q[n] - (len - (cur - before)) / 2;

			while(state[0] != 0 || state[1] != 0)
				state[ask(2, n)] ^= 1;
		}
		else{
			int state[2] = {0, 0}, before = st[ind];
			while(state[0] != 1 || state[1] != 0)
				state[(ask(j, i) ^ i) & 1] ^= 1;

			int cur = st[ind];
			int len = i;
			q[i] = (len - (cur - before)) / 2;

			while(state[0] != 0 || state[1] != 0)
				state[(ask(j, i) ^ i) & 1] ^= 1;
		}
	}

	cout << "! ";
	for(int i = 1; i <= n; i++)
		cout << q[i] - q[i - 1];

	cout << endl;

	return 0;
}


#include <bits/stdc++.h>

using namespace std;

#define pb push_back
#define mp make_pair
#define fi first
#define se second
#define INF (1LL << 55)
#define MOD (1000 * 1000 * 1000 + 7)
#define maxn 311

typedef long long ll;
typedef long double ld;
typedef pair<int, int> pii;

int st[maxn], ind;
int q[maxn];

bool ask(int l, int d){
	cout << "? " << l << " " << d << endl;
	cin >> st[++ind];
	return (st[ind] - st[ind - 1]) & 1;
}

int main(){
	int n;
	cin >> n >> st[0];
	q[n] = st[0];
	for(int i = 1; i < n; i++){
		int j = i - n % 2;

		if(j == 0){
			int state[2] = {0, 0}, before = st[ind];
			while(state[0] != 1 || state[1] != 0)
				state[ask(2, n)] ^= 1;

			int cur = st[ind];
			int len = n - 1;
			q[i] = q[n] - (len - (cur - before)) / 2;

			while(state[0] != 0 || state[1] != 0)
				state[ask(2, n)] ^= 1;
		}
		else{
			int state[2] = {0, 0}, before = st[ind];
			while(state[0] != 1 || state[1] != 0)
				state[(ask(j, i) ^ i) & 1] ^= 1;

			int cur = st[ind];
			int len = i;
			q[i] = (len - (cur - before)) / 2;

			while(state[0] != 0 || state[1] != 0)
				state[(ask(j, i) ^ i) & 1] ^= 1;
		}
	}

	cout << "! ";
	for(int i = 1; i <= n; i++)
		cout << q[i] - q[i - 1];

	cout << endl;

	return 0;
}