#include<bits/stdc++.h>
#define endl '\n'
using namespace std;
using ll = long long;
const int N = 1e5 + 3;
struct Segment_Tree {
int t[4 * N];
Segment_Tree() {
memset(t, 0, sizeof t);
}
auto merge(auto &l, auto &r) { // <== Change this function
return l + r;
}
void update(int node, int st, int en, int idx, int val) { //=> O(log n)
if (st == en) {
t[node] += val;
return;
}
int mid = (st + en) >> 1;
if (idx <= mid) update(node << 1, st, mid, idx, val);
else update(node << 1 | 1, mid + 1, en, idx, val);
// Merging left and right portion
auto &Cur = t[node];
auto &Left = t[node << 1];
auto &Right = t[node << 1 | 1];
Cur = merge(Left, Right);
return;
}
int query(int node, int st, int en, int l, int r) { //=> O(log n)
if (st > r || en < l) { // No overlapping and out of range
return 0; // <== careful
}
if (l <= st && en <= r) { // Complete overlapped (l-r in range)
return t[node];
}
// Partial overlapping
int mid = (st + en) >> 1;
auto Left = query(node << 1, st, mid, l, r);
auto Right = query(node << 1 | 1, mid + 1, en, l, r);
return merge(Left, Right);
}
} Left, Right;
int main() {
ios::sync_with_stdio(false); cin.tie(0);
int n;
cin >> n;
assert(n >= 1 && n <= 1e5);
vector<int> v(n);
for(auto &i: v) {
cin >> i;
assert(i >= 0 && i <= n - 1);
Right.update(1, 0, n - 1, i, +1);
}
int ans = 0;
for(auto i: v) {
Right.update(1, 0, n - 1, i, -1);
if(Right.query(1, 0, n - 1, i, n - 1) >= i or Left.query(1, 0, n - 1, 0, i) >= i) ++ans;
Left.update(1, 0, n - 1, i, +1);
}
cout << ans << endl;
return 0;
}