#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define pii pair<ll, ll>
#define fi first
#define sec second
#define ld long double
const ll N = 1e5;
const ll INF = 4e18;
const ll MOD = 998244353;
struct ST{
ll n;
vector<ll> sg;
ST(ll _n){
n = _n;
sg = vector<ll> (4 * n + 5, INF);
}
void upd(ll l, ll r, ll cur, ll idx, ll val){
if(l == r) sg[cur] = min(sg[cur], val);
else{
ll mid = (l + r) / 2;
if(idx <= mid) upd(l, mid, cur * 2, idx, val);
else upd(mid + 1, r, cur * 2 + 1, idx, val);
sg[cur] = min(sg[cur * 2], sg[cur * 2 + 1]);
}
}
ll query(ll l, ll r, ll cur, ll x, ll y){
if(l > y || r < x) return INF;
if(l >= x && r <= y) return sg[cur];
ll mid = (l + r) / 2;
return min(query(l, mid, cur * 2, x, y), query(mid + 1, r, cur * 2 + 1, x, y));
}
};
int main(){
ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
int tc = 1;
// cin >> tc;
for(;tc--;){
ll n; cin >> n;
vector<ll> a(n + 5);
for(int i = 1; i <= n; i++) cin >> a[i];
vector<pii> segs;
ll lst = 1;
for(int i = 1; i <= n; i++){
if(a[i] < a[i - 1]){
segs.push_back({lst, i - 1});
lst = i;
}
}
segs.push_back({lst, n});
ST sg(n);
for(auto [i, j] : segs){
ll lst = a[i];
for(int k = i + 1; k <= j; k++){
if(sg.query(1, n, 1, a[k - 1], a[k]) < lst){
sg.upd(1, n, 1, a[k - 1], lst);
lst = a[k];
}
}
sg.upd(1, n, 1, a[j], lst);
}
ll ans = 0;
for(int i = 1; i <= n; i++){
ans += (sg.query(1, n, 1, i, i) != INF);
}
cout << ans << "\n";
}
}
/*
*/
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |