// #include using namespace std; #define fi first #define se second #define all(x) x.begin(), x.end() #define lch (o << 1) #define rch (o << 1 | 1) typedef double db; typedef long long ll; typedef unsigned int ui; typedef pair pint; typedef tuple tint; const int N = 2e5 + 5; const int INF = 0x3f3f3f3f; const ll INF_LL = 0x3f3f3f3f3f3f3f3f; map> intToSet; int a[N]; struct BITree { int t[N]; int lowbit(int x) { return x & -x; } void add(int x, int det) { for (; x < N; x += lowbit(x)) t[x] += det; } int query(int x) { int ret = 0; for (; x; x -= lowbit(x)) ret += t[x]; return ret; } }; BITree bt; int main() { ios::sync_with_stdio(0); int n; cin >> n; for (int i = 1; i <= n; i++) { cin >> a[i]; intToSet[a[i]].insert(i); bt.add(i, 1); } sort(a + 1, a + n + 1); int pre = n + 1; int ans = 0; for (int i = n; i >= 1; i--) { auto &s = intToSet[a[i]]; auto p = s.lower_bound(pre); int now; int det = 0; if (p != s.begin()) { p--; now = *p; det = bt.query(pre) - bt.query(now); } else { now = *s.rbegin(); det = bt.query(pre) - (bt.query(n) - bt.query(now)); } s.erase(now); bt.add(now, -1); ans += det != 0; pre = now; } cout << ans << endl; return 0; }