Cod sursa(job #2711660)

Utilizator vladth11Vlad Haivas vladth11 Data 24 februarie 2021 15:54:31
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.4 kb
#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;
}