https://www.nowcoder.com/questionTerminal/30fb9b3cab9742ecae9acda1c75bf927
#include<iostream>
#include<algorithm>
#include<queue>
#include<cmath>
#include<math.h>
#include<string>
#include<string.h>
#include<map>
#include<unordered_map>
#include<unordered_set>
#include<set>
#include<stack>
#include<sstream>
#include<assert.h>
#include<vector>
#include<cstdio>
#include<string>
#include<map>
using namespace std;
vector<int> LIS(vector<int>& a) {
// write code here
vector<int> dp(a.size(), 0);
vector<int> tmp(a.size(), 0x3f3f3f3f);
int maxlen = 0;
int maxidx = 0;
for (int i = 0; i < a.size(); i++) {
dp[i] = lower_bound(tmp.begin(), tmp.end(), a[i]) - tmp.begin() + 1;
*lower_bound(tmp.begin(), tmp.end(), a[i]) = a[i];
if (dp[i] >= maxlen) {
maxlen = dp[i];
maxidx = i;
}
}
vector<int> ans(maxlen);
for (int i = maxidx; i >= 0; i--) {
if (dp[i] == maxlen) {
ans[--maxlen] = a[i];
}
}
return ans;
}
int main() {
int n;
cin >> n;
vector<int> arr(n);
for (int i = 0; i < n; i++) {
cin >> arr[i];
}
vector<int> ans = LIS(arr);
for (int i = 0; i < ans.size(); i++) {
cout << ans[i] << " ";
}
return 0;
}