/*
交互题：有向图n个节点，输入每个节点的入度数，求互通的两个点A、B，要求|in[A]-in[B]|最大
可无限询问? A B，返回Yes或No，但返回Yes后就必须输出答案，不能重复询问。

方案：按照in[N]排序，两两成对{x, y}，要求in[x]>in[y],然后要按照能确定一边到达的队进行询问。
依据：如果入度大的x能到达入度小的y，则y很容易能到达x?
*/
#include <iostream>
#include <cstdio>
#include <map>
#include <vector>
#include <cmath>
#include <algorithm>
#include <cstring>
using namespace std;
typedef long long ll;
const int N = 505;
struct Node {
  int x, y, d;
  bool operator < (const Node &n1) const {
    return d > n1.d;
  }
};
int n, in[N];
vector<Node> v;

bool query(int x, int y) {
  printf("? %d %d\n", x, y);
  fflush(stdout);
  char s[100];
  scanf("%s", s+1);
  
  return s[1]=='Y';
}

int main() {
  cin>>n;
  for(int i=1; i<=n; i++)
    cin>>in[i];
  for(int i=1; i<=n; i++)
    for(int j=i+1; j<=n; j++) {
      if(in[i]>in[j])
        v.push_back((Node){i, j, in[i]-in[j]});
      else
        v.push_back((Node){j, i, in[j]-in[i]});
    }
  sort(v.begin(), v.end());
  for(int i=0; i<v.size(); i++) {
    if(query(v[i].x, v[i].y)) {
      printf("! %d %d\n", v[i].x, v[i].y);
      fflush(stdout);
      return 0;
    }
  }
  printf("! 0 0\n");
  fflush(stdout);
  return 0;
}
