#include #define rep(i,a,b) for(int i = a; i < (b); ++i) #define sz(x) (int)(x).size() using namespace std; using ll = long long; using pi = pair; using vi = vector; #define clog if(0) clog struct N { int mn = 1000000; int mx = -1000000; int ladd = 0; friend N comb(const N& a, const N& b) { return N{min(a.mn, b.mn), max(a.mx, b.mx)}; } friend ostream& operator<<(ostream& o, N a) { o << a.mn << ' ' << a.mx << ' '; return o; } }; struct IT { vector it; int s; void push(int i) { for(int j : {2*i, 2*i+1}) { it[j].mn += it[i].ladd; it[j].mx += it[i].ladd; it[j].ladd += it[i].ladd; } it[i].ladd = 0; } IT(vector& as) { int n = as.size(); s = 1; while(s < n) s *= 2; it.resize(2*s); for(int i = 0; i < n; ++i) { it[s + i] = N{as[i], as[i]}; } for(int i = s-1; i > 0; --i) { it[i] = comb(it[2*i], it[2*i+1]); } } N rmm(int b, int e, int bi = 0, int ei = -1, int i = 1) { if(ei == -1) ei = s; if(e <= bi || ei <= b) return N{}; if(b <= bi && ei <= e) { return it[i]; } push(i); int mi = (bi + ei)/2; return comb( rmm(b, e, bi, mi, 2*i ), rmm(b, e, mi, ei, 2*i+1)); } int pget(int i) { return rmm(i, i+1).mn; } void radd(int b, int e, int a, int bi = 0, int ei = -1, int i = 1) { if(ei == -1) ei = s; if(e <= bi || ei <= b) return; if(b <= bi && ei <= e) { it[i].mn += a; it[i].mx += a; it[i].ladd += a; return; } push(i); int mi = (bi + ei)/2; radd(b, e, a, bi, mi, 2*i ); radd(b, e, a, mi, ei, 2*i+1); it[i] = comb(it[2*i], it[2*i+1]); } }; void solve() { int n; cin >> n; vector as(n); vector os(n); for(int i = 0; i < n; ++i) { cin >> as[i]; --as[i]; } for(int i = 0; i < n; ++i) { os[as[i]] = i; } vector ps(n+1, 0); for(int i = 0; i <= n; ++i) { ps[i] = -i; } IT left(ps); IT right(ps); vector good(n); for(int v = 0; v < n; ++v) { for(int i = 0; i <= n; ++i) { clog << left.pget(i) << ' '; } clog << '\n'; for(int i = 0; i <= n; ++i) { clog << right.pget(i) << ' '; } clog << '\n'; int i = os[v]; clog << "as[" << i << "] = " << v << '\n'; N l = left.rmm(0, i); int lb = left.pget(i); N r = right.rmm(0, n-1-i); int rb = right.pget(n-1-i); l.mn = lb - l.mn; l.mx = lb - l.mx; swap(l.mn, l.mx); r.mn = rb - r.mn; r.mx = rb - r.mx; swap(r.mn, r.mx); r.mn *= -1; r.mx *= -1; swap(r.mn, r.mx); N fin = {max(l.mn, r.mn), min(l.mx, r.mx)}; good[i] = (l.mn <= 0 && l.mx >= 0) || (r.mn <= 0 && 0 <= r.mx) || fin.mn <= fin.mx; clog << l << ' ' << r << '\n'; left.radd(i+1, n+1, 2); right.radd(n-i, n+1, 2); } for(int i = 0; i < n; ++i) { if(good[i]) cout << "YES "; else cout << "NO "; } cout << '\n'; } int main() { ios::sync_with_stdio(false); cin.tie(nullptr); solve(); }