#include <bits/stdc++.h>
using namespace std;
const int N = 5E5 + 10;
struct Query {
  int type, x, y;
  Query(int _type = 0, int _x = 0, int _y = 0) : type(_type), x(_x), y(_y){};
};
int n;
Query q[N];
vector<int> rar;
struct FenwickTree {
  set<int> ft[N];
  void Update(int x, int y) {
    int pos = lower_bound(rar.begin(), rar.end(), x) - rar.begin() + 1;
    for (int i = pos; i <= rar.size(); i += i & -i) ft[i].insert(y);
  }
  bool Get(int x, int y) {
    bool ret = 1;
    int pos = lower_bound(rar.begin(), rar.end(), x) - rar.begin() + 1;
    for (int i = pos; i > 0; i -= i & -i) {
      if (ft[i].empty()) continue;
      if (*ft[i].rbegin() > y) ret = 0;
    }
    return ret;
  }
} FT;
void Read_Input() {
  scanf("%d\n", &n);
  for (int i = 1; i <= n; i++) {
    char c;
    int x, y;
    scanf("%c %d %d\n", &c, &x, &y);
    if (c == '+')
      q[i] = Query(0, x, y);
    else
      q[i] = Query(1, x, y), rar.push_back(y);
    rar.push_back(x);
  }
  sort(rar.begin(), rar.end());
  rar.resize(unique(rar.begin(), rar.end()) - rar.begin());
}
void Solve() {
  int X = 0, Y = 0;
  for (int i = 1; i <= n; i++) {
    if (!q[i].type) {
      if (q[i].x > q[i].y) swap(q[i].x, q[i].y);
      X = max(X, q[i].x);
      Y = max(Y, q[i].y);
    } else {
      if (q[i].x > q[i].y) swap(q[i].x, q[i].y);
      if (X <= q[i].x && Y <= q[i].y)
        puts("YES");
      else
        puts("NO");
    }
  }
}
int main() {
  Read_Input();
  Solve();
  return 0;
}
