Cod sursa(job #2662459)

Utilizator razvanradulescuRadulescu Razvan razvanradulescu Data 24 octombrie 2020 09:59:52
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.15 kb
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;

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

int a[100005], n, k, lMax[100005];
int bestLog = 1;
vector<int> v;

int getLog(int lung)
{
    while(bestLog<lung)
        bestLog<<=1;
    return bestLog;
}

int binarySearch(int nr)
{
    int j = -1;
    int log = getLog(v.size());
    for(; log; log>>=1)
        if(j + log < v.size() && v[j+log] < nr)
            j+=log;
    return j+1;
}

void read()
{
    f>>n;
    for(int i = 0; i<n; i++)
    {
        f>>a[i];
        int poz = binarySearch(a[i]);
        lMax[i] = poz;
        if(poz >= v.size())
            v.push_back(a[i]);
        else
            v[poz] = a[i];
    }
}

void print()
{
    vector<int> sol;
    int maxim = v.size()-1;
    for(int i = n-1; i>=0; i--)
    {
        if(maxim == lMax[i])
        {
            sol.push_back(a[i]);
            maxim--;
        }
    }
    g<<sol.size()<<"\n";
    for(auto itr = sol.rbegin(); itr != sol.rend(); ++itr)
    {
        g<<*itr<<" ";
    }
}

int main()
{
    read();
    print();
    return 0;
}