Pagini recente » Cod sursa (job #1116785) | Cod sursa (job #2961681) | Cod sursa (job #2900297) | Cod sursa (job #2278420) | Cod sursa (job #2711660)
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
#define debug(x) cerr << #x << " " << x << "\n"
#define debug_with_space(x) cerr << #x << " " << x << " "
//#include "shoes.h"
using namespace std;
using namespace __gnu_pbds;
typedef long long ll;
typedef pair <int, int> pii;
typedef pair <ll, pii> piii;
typedef tree <pii, null_type, less <pii>, rb_tree_tag, tree_order_statistics_node_update> OST;
const ll NMAX = 100001;
const ll INF = (1LL << 60);
const ll MOD = 1000000007;
const ll BLOCK = 316;
const ll nr_of_bits = 20;
const double eps = 0.0000000001;
int v[NMAX];
int x[NMAX];
int last[NMAX];
int cnt;
int main() {
ifstream cin("scmax.in");
ofstream cout("scmax.out");
int n, i, poz;
cin >> n;
for(i = 1; i <= n; i++){
cin >> x[i];
int r = 0, pas = (1 << 16);
while(pas){
if(r + pas <= cnt && x[v[r + pas]] < x[i])
r += pas;
pas /= 2;
}
r++;
last[i] = v[r - 1];
if(r == cnt + 1){
cnt++;
poz = i;
}
v[r] = i;
}
cout << cnt << "\n";
vector <int> sol;
while(poz != 0){
sol.push_back(x[poz]);
poz = last[poz];
}
reverse(sol.begin(), sol.end());
for(auto x : sol){
cout << x << " ";
}
return 0;
}