#include using namespace std; #include using namespace atcoder; #define rep(i, n) for(int i = 0; i < (int)(n); ++i) int op(int a, int b) {if(a > b) return a; return b;} int e() {return -1e9;} int main() { int N; cin >> N; vector H(N); rep(i, N) cin >> H[i]; { vector> cp(N); rep(i, N) cp[i] = {H[i], i}; sort(cp.begin(), cp.end()); rep(i, N) H[cp[i].second] = i + 1; } vector seg(4, segtree(N + 2)); auto nseg = seg; auto chmax = [&](int i, int x, int val) { nseg[i].set(x, max(nseg[i].get(x), val)); }; auto affect = [&](int x, int sc) { chmax(0, x, seg[0].prod(x, N + 2) + sc); chmax(1, x, max(seg[0].prod(0, x), seg[1].prod(0, x)) + sc); chmax(2, x, max(seg[1].prod(x, N + 2), seg[2].prod(x, N + 2)) + sc); chmax(3, x, max(seg[2].prod(0, x), seg[3].prod(0, x)) + sc); }; rep(x, N + 2) chmax(0, x, (H[0] >= x ? 1 : 0) + (x == H[1] ? 1 : 0)); swap(seg, nseg); for(int i = 2; i < N; ++i) { nseg = seg; affect(H[i], 1); affect(0, 0); affect(N + 1, 0); swap(seg, nseg); } cout << N - seg[3].all_prod() << "\n"; }