#include <bits/stdc++.h>

using namespace std;
using ll = long long;
#define int ll
using VI = vector<int>;
using VVI = vector<VI>;
using PII = pair<int, int>;

#define FOR(i, a, n) for (ll i = (ll)a; i < (ll)n; ++i)
#define REP(i, n) FOR(i, 0, n)
#define ALL(x) x.begin(), x.end()
#define PB push_back

const ll LLINF = (1LL<<60);
const int INF = (1LL<<30);
const int MOD = 1000000007;

template <typename T> T &chmin(T &a, const T &b) { return a = min(a, b); }
template <typename T> T &chmax(T &a, const T &b) { return a = max(a, b); }
template <typename T> bool IN(T a, T b, T x) { return a<=x&&x<b; }
template<typename T> T ceil(T a, T b) { return a/b + !!(a%b); }
template<class S,class T>
ostream &operator <<(ostream& out,const pair<S,T>& a){
  out<<'('<<a.first<<','<<a.second<<')';
  return out;
}
template<class T>
ostream &operator <<(ostream& out,const vector<T>& a){
  out<<'[';
  REP(i, a.size()) {out<<a[i];if(i!=a.size()-1)out<<',';}
  out<<']';
  return out;
}

int dx[] = {0, 1, 0, -1}, dy[] = {1, 0, -1, 0};

template <typename monoid>
class segmentTree {
public:
  using M = monoid;
  using T = typename M::value_type;

  int sz;
  vector<T> x;

  segmentTree(int n = 1e5) {
    sz = 1; while(sz < n) sz *= 2;
    init();
  }
  void init() { x.assign(sz*2, M::id()); }

  // [a, b)
  T query(int a, int b, int k, int l, int r) {
    if(r <= a || b <= l) return M::id();
    if(a <= l && r <= b) return x[k];
    return M::f(query(a, b, 2*k+1, l, (l+r)/2),
                query(a, b, 2*k+2, (l+r)/2, r));
  }
  T query(int a, int b) {return query(a, b, 0, 0, sz);}
  // 点更新
  void update(int i, const T &val) {
    i += sz-1;
    x[i] = M::g(x[i], val);
    while(i > 0) {
      i = (i-1) / 2;
      x[i] = M::f(x[i*2+1], x[i*2+2]);
    }
  }
};

template <typename T>
struct min_monoid {
  using value_type = T;
  static constexpr T id() { return std::numeric_limits<T>::max(); }
  static T f(const T &a, const T &b) { return min(a, b); }
  static T g(const T &a, const T &b) { return b; }
};
template <typename T>
struct max_monoid {
  using value_type = T;
  static constexpr T id() { return std::numeric_limits<T>::min(); }
  static T f(const T &a, const T &b) { return max(a, b); }
  static T g(const T &a, const T &b) { return b; }
};
template <typename T>
struct sum_monoid {
  using value_type = T;
  static constexpr T id() {return 0;}
  static T f(const T &a, const T &b) { return a+b; }
  static T g(const T &a, const T &b) { return a+b; }
};

template <typename T>
using rmq = segmentTree<min_monoid<T>>;
template <typename T>
using rsq = segmentTree<sum_monoid<T>>;

signed main(void)
{
  cin.tie(0);
  ios::sync_with_stdio(false);

  int n;
  cin >> n;
  VI x(n);
  REP(i, n) cin >> x[i];

  vector<bool> ans(n);
  bool flag = false;
  rsq<int> seg(n);
  REP(i, n) {
    // cout << seg.query(0, x[i]+1) << endl;
    // i枚目のコインについて
    // 置けない
    if(seg.query(0, 1) == 1) {
      ans[i] = false;
    }
    // 十分大きいので置いたことにして無視
    else if(x[i] >= n) {
      ans[i] = true;
      flag = true;
    }
    // x[i]にすでにあったら消してx[i]-1に移すみたいな処理
    else if(seg.query(0, x[i]+1) < x[i]) {
      int j;
      for(j=x[i]; seg.query(j, j+1); --j) {
        seg.update(j, -1);
      }
      // cout << "j:" << j << endl;
      ans[i] = true;
      seg.update(j, 1);
    }
    // [0,x[i]] がすでに埋まってたら0に行く
    else if(seg.query(0, x[i]+1) == x[i]) {
      // 0に置くときは他のところに置いてはいけない
      if(flag || seg.query(x[i]+1, n)) ans[i] = false;
      // [1, x[i]] を消して 0 を追加する処理
      else {
        FOR(j, 1, x[i]+1) seg.update(j, -1);
        seg.update(0, 1);
        ans[i] = true;
      }
    }
    else {
      assert(false);
    }
  }

  REP(i, n) cout << (ans[i] ? "Yes" : "No") << endl;

  return 0;
}

