#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
struct FenwickMax {
int n;
vector<int> bit;
FenwickMax(int _n=0){init(_n);}
void init(int _n){
n=_n;
bit.assign(n+1, 0);
}
void update(int i, int val){
for(; i<=n; i += i&-i) bit[i] = max(bit[i], val);
}
int query(int i){
int res = 0;
for(; i>0; i -= i&-i) res = max(res, bit[i]);
return res;
}
};
int main() {
ios_base::sync_with_stdio(0);
cin.tie(0);
int N, D;
cin >> N >> D;
vector<long long> A(N+1);
for(int i=1;i<=N;i++) cin >> A[i];
vector<long long> vals;
vals.reserve(N);
for(int i=1;i<=N;i++) vals.push_back(A[i]);
sort(vals.begin(), vals.end());
vals.erase(unique(vals.begin(), vals.end()), vals.end());
auto getIndex = [&](long long x){
return int(lower_bound(vals.begin(), vals.end(), x) - vals.begin()) + 1;
};
FenwickMax bit((int)vals.size());
vector<int> dp(N+1, 0);
for(int i=1;i<=N;i++){
int idx = getIndex(A[i]);
int best = 0;
if(idx-1 >= 1) best = bit.query(idx-1);
dp[i] = best + 1;
bit.update(idx, dp[i]);
}
cout << dp[N] << '\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... |