Cod sursa(job #2101993)

Utilizator TudoseSanzianaTudose Sanziana TudoseSanziana Data 8 ianuarie 2018 12:28:57
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.04 kb
#include <bits/stdc++.h>
using namespace std;

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

const int NMAX = 1e5;

int n;
int v[NMAX + 2];

int len;
int val[NMAX + 2], best[NMAX + 2];
vector<int> ans;

int bs(int arg)
{
    int st = 0, dr = len, last = len;

    while(st <= dr)
    {
        int med = (st + dr) / 2;

        if(val[med] >= arg)
            dr =  med - 1;
        else
        {
            st = med + 1;
            last = med;
        }
    }

    return last + 1;
}

int main()
{
    in >> n;
    for(int i = 1; i <= n; i++)
        in >> v[i];

    for(int i = 1; i <= n; i++)
    {
        int pos = bs(v[i]);

        val[pos] = v[i];
        best[i] = pos;
        len = max(len, pos);
    }

    out << len << '\n';
    for(int i = n; i >= 1 && len; i--)
        if(best[i] == len)
        {
            ans.push_back(v[i]);
            len--;
        }

    for(int i = ans.size() - 1; i >= 0; i--)
        out << ans[i] << ' ';
    out << '\n';

    return 0;
}