#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>

#define x first
#define y second
#define mp make_pair
#define up_b upper_bound
#define low_b lower_bound
#define sz(x) (int)x.size()
#define bit __builtin_popcount
#define all(x) x.begin(),x.end()
#define show(x) cout<<(#x)<<" is "<<(x)<<endl

using namespace std;
using namespace __gnu_pbds;

template<typename T> using indexed_set=tree <T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>;

typedef long long ll;
typedef long double ld;
typedef pair<ll,ll> pll;
typedef pair<int,int> pii;
typedef pair<int,ll> pil;
typedef pair<ll,int> pli;
typedef vector<vector<int>> matrix;

const ll INF=1e18+123;
const ld EPS=1e-9;
const int inf=1e9+123;
const int MOD=1e9+7;
const int N=5e5+123;
const int M=1e6+123;
const int dx[]={0,0,1,-1};
const int dy[]={1,-1,0,0};

int ask(int c,int d){
    cout<<"? "<<c<<" "<<d<<endl;
    int x;
    cin>>x;
    return x;
}

int main(){
    int c=0,d=0;
    int a=0,b=0;
    int l=ask(0,0);
    for(int i=29;i>=0;i--){
            int z;
            z=ask(a+(1<<i),b+(1<<i));
            if(z!=l){
                if(z==1){
                    b+=(1<<i);
                }
                else if(z==-1){
                    a+=(1<<i);
                }
                else break;
            }
            l=z;
    }
   // cout<<a<<" "<<b<<endl;
    for(int i=29;i>=0;i--){
            if(a&(1<<i) || b&(1<<i))continue;
            int z=ask(a+(1<<i),b);
            if(z==-1){
                a+=(1<<i);
                b+=(1<<i);
            }
        }
    cout<<"! "<<a<<" "<<b<<endl;
    return 0;
}
