#include <bits/stdc++.h>
using namespace std;
#define int long long
#define pii pair<int,int>
const int maxn = 2e5 + 10;
int A[maxn];
int L[maxn], R[maxn];
//seg
int tree[4 * maxn];
void reset() {
for (int i = 0; i < 4*maxn; i++) tree[i] = 0;
}
void update(int node, int l, int r, int pos, int val) {
if(l == r) {
tree[node] = val;
return;
}
int mid = (l + r) / 2;
if(pos <= mid) update(2 * node, l, mid, pos, val);
else update(2 * node + 1, mid + 1, r, pos, val);
tree[node] = tree[2 * node] + tree[2 * node + 1];
return;
}
int query(int node, int tl, int tr, int l, int r) {
if(tl > r || tr < l) return 0;
if(tl >= l && tr <= r) return tree[node];
int mid = (tl + tr) / 2;
return max(query(2 * node, tl, mid, l, r), query(2 * node + 1, mid + 1, tr, l, r));
}
int32_t main() {
ios_base::sync_with_stdio(false); cin.tie(0);
int n, m; cin >> n >> m;
vector<int> ord;
for (int i = 1; i <= n; i++) {
cin >> A[i];
ord.push_back(A[i]);
}
map<int,int> comp;
sort(ord.begin(), ord.end());
ord.erase(unique(ord.begin(), ord.end()), ord.end());
int id = 1;
for (auto x : ord) comp[x] = id++;
for (int i = 1; i <= n; i++) {
int aux = query(1, 1, n, 1, comp[A[i]] - 1);
L[i] = aux + 1;
update(1, 1, n, comp[A[i]], L[i]);
}
reset();
for (int i = n; i >= 1; i--) {
int aux = query(1, 1, n, comp[A[i]] + 1, n);
R[i] = aux + 1;
update(1, 1, n, comp[A[i]], R[i]);
}
int res = 0;
for (int i = 1; i <= n; i++) res = max(res, L[i] + R[i] - 1);
cout << res << '\n';
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... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |