Pagini recente » Cod sursa (job #1385926) | Cod sursa (job #1935927) | Cod sursa (job #2937503) | Cod sursa (job #358034) | Cod sursa (job #3148347)
#include <bits/stdc++.h>
#pragma GCC optimize("O3")
using namespace std;
#define INFILE "scmax.in"
#define OUTFILE "scmax.out"
const int VMAX = 1e5 + 2;
int n;
int v[VMAX], d[VMAX], prv[VMAX];
struct AIB {
int n;
pair<int , int> aib[VMAX];
AIB (int N){
n = N;
for (int i = 1; i <= n; i++){
aib[i] = make_pair(0, 0);
}
}
void update (int pos , int val){
for (int i = pos; i <= n; i += (i & -i)){
if (val > aib[i].first){
aib[i] = make_pair(val, pos);
}
}
}
pair<int , int> query (int pos){
pair<int , int> rez = make_pair(0, 0);
for (int i = pos; i > 0; i -= (i & -i)){
rez = max(aib[i] , rez);
}
return rez;
}
};
map<int, int> norma;
map<int, int> revNorma;
void solve(){
vector<int> vals;
cin >> n;
for(int i = 1; i <= n; ++i){
cin >> v[i];
++norma[v[i]];
if(norma[v[i]] == 1){
vals.push_back(v[i]);
}
}
sort(vals.begin(), vals.end());
for(int i = 0; i < vals.size(); ++i){
norma[vals[i]] = i + 1;
revNorma[i + 1] = vals[i];
}
for(int i = 1; i <= n; ++i){
v[i] = norma[v[i]];
}
AIB aib(n);
int ans, crt;
ans = 0, crt = -1;
vector<int> res(ans);
for(int i = 1; i <= n; ++i){
pair<int, int> q = aib.query(v[i] - 1);
d[v[i]] = q.first + 1;
prv[v[i]] = q.second;
aib.update(v[i], d[v[i]]);
if(d[v[i]] > ans){
ans = d[v[i]];
crt = v[i];
}
}
vector<int> result(ans);
for(int i = ans - 1; i >= 0; --i){
result[i] = revNorma[crt];
crt = prv[crt];
}
cout << ans << '\n';
for(int i = 0; i < ans; ++i){
cout << result[i] << " ";
}
}
int main(){
ios_base::sync_with_stdio(false);
freopen(INFILE, "r", stdin);
freopen(OUTFILE, "w", stdout);
cin.tie(nullptr);
cout.tie(nullptr);
solve();
return 0;
}