Cod sursa(job #2723370)

Utilizator ardutgamerAndrei Bancila ardutgamer Data 13 martie 2021 22:42:14
Problema Subsir crescator maximal Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.48 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <stack>
#include <algorithm>
#include <cmath>
#include <iomanip>
#include <cstdlib>

using namespace std;

ifstream fin("scmax.in");
ofstream fout("scmax.out");

const int NMAX = 100005;
const int INF = 2e9;

vector<int>sol;
int v[NMAX];
int best[NMAX];
int lg[NMAX];
int n, k = 0;

int caut_bin(int x,int y,int val)
{
    int st = x;
    int dr = y;
    int med, ans = -1;
    while(st <= dr)
    {
        med = (st + dr) / 2;
        if(best[med] >= val)
        {
            ans = med;
            dr = med-1;
        }
        else
            st = med+1;
    }
    return ans;
}

int main()
{
    ios_base::sync_with_stdio(false);
    fin.tie(0);fout.tie(0);

    fin >> n;
    for(int i = 1 ; i <= n ; i++)
        fin >> v[i];

    lg[1] = 1;
    best[++k] = v[1];

    int ma = 0;

    for(int i = 2 ; i <= n ; i++)
    {
        int pos = caut_bin(1,i-1,v[i]);
        if(pos == -1)
        {
            best[++k] = v[i];
            lg[i] = k;
            ma = max(ma, k);
            continue;
        }
        best[pos] = v[i];
        lg[i] = pos;
        ma = max(ma, pos);
    }

    int cnt = ma;
    fout << ma << '\n';
    for(int i = n ; i >= 1 ; i--)
        if(lg[i] == cnt){
            sol.push_back(v[i]);
            cnt--;
        }
    reverse(sol.begin(),sol.end());
    for(int e:sol)
        fout << e << ' ';

    return 0;
}