#include <bits/stdc++.h>
#define U unsigned
#define LL long long
#define DB double
#define LD long double
#define pii pair<int,int>
#define pLi pair<LL,int>
#define pLL pair<LL,LL>
#define pb push_back
#define ve vector<int>
#define VE vector<LL>
#define fr first
#define se second
using namespace std;
inline LL read()
{
LL x = 0,f = 1;char ch = getchar();
while (!isdigit(ch)) (ch == '-') && (f = -1),ch = getchar();
while (isdigit(ch)) x = x*10+ch-48,ch = getchar();
return x*f;
}
const int N = 2000;
int t[N<<2];
inline int merge(int a,int b)
{
if (!a || !b) return a|b;
printf("? %d %d\n",a,b),fflush(stdout);
return read() ? b : a;
}
void M(int l,int r,int L,int R,int i)
{
if (l == r) return (void)(t[i] = l);
int mid = (l+r)>>1;
if (mid >= L) M(l,mid,L,R,i<<1);
if (mid+1 <= R) M(mid+1,r,L,R,i<<1|1);
t[i] = merge(t[i<<1],t[i<<1|1]);
}
void D(int l,int r,int p,int i)
{
if (l == r) return (void)(t[i] = 0);
int mid = (l+r)>>1;
if (p <= mid) D(l,mid,p,i<<1);
else D(mid+1,r,p,i<<1|1);
t[i] = merge(t[i<<1],t[i<<1|1]);
}
int main()
{
int n = read(),l = 1;
for (int i = 1;i <= n;i++)
{
int x = read();
M(1,N,l,l+x-1,1),l += x;
printf("! %d\n",t[1]),fflush(stdout);
D(1,N,t[1],1);
}
return 0;
}