#include <bits/stdc++.h>
#define GOOD_LUCK ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0);
#define int long long
#define endl "\n"
#define ff first
#define ss second
#define pb push_back
#define all(v) v.begin(), v.end()
using namespace std;
constexpr int MAX = 2e+5 + 1, INF = 2e+16, MOD = 1e+9 + 7, K = 31;
struct SegTree{
int n;
vector <int> t;
void init(int n1) {
n = n1;
t.assign(4*(n+2), INF);
}
int merge(int a, int b) {
return min(a, b); // TODO
}
int find(int v, int tl, int tr, int l, int r) {
if (l > r) return INF; // TODO
if (tl == l && tr == r) return t[v];
int tm = (tl + tr) / 2;
int r1 = find(v*2, tl, tm, l, min(r, tm));
int r2 = find(v*2+1, tm+1, tr, max(l, tm+1), r);
return merge(r1, r2);
}
void update(int v, int tl, int tr, int i, int x) {
if (tl == tr) {
t[v] = x;
return;
}
int tm = (tl + tr) / 2;
if (i <= tm) update(v*2, tl, tm, i, x);
else update(v*2+1, tm+1, tr, i, x);
t[v] = merge(t[v*2], t[v*2+1]);
}
int get(int l, int r) {
return find(1, 0, n-1, l, r);
}
void upd(int i, int x) {
update(1, 0, n-1, i, x);
}
};
void _() {
int n;
cin >> n;
vector <int> v(n);
for (int &i : v) cin >> i;
SegTree t;
t.init(1000005);
for (int i=0; i < n; i++) t.upd(v[i], i);
int res=1;
for (int i = 0; i < n-1; i++) {
if (v[i+1] < v[i]) {
res++;
continue;
}
if (t.get(v[i]+1, v[i+1]-1) > i + 1) {
}
else res++;
}
cout << res;
}
signed main() {
GOOD_LUCK
int tests=1;
// cin >> tests;
for (int i=1; i <= tests; i++) {
_();
cout << endl;
}
return 0;
}
| # | 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... |