Cod sursa(job #2870711)

Utilizator k2y201342asdfadfsafsd k2y20 Data 12 martie 2022 15:18:39
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.21 kb
#include <bits/stdc++.h>
using namespace std;

#define ll long long
ifstream in("scmax.in");
ofstream out("scmax.out");

const int N=1e5;
int v[N+5],p[N+5];

int cb(vector <int> a, int x)
{
    int st=1,dr=a.size()-1,mij;
    //poz celui mai mic el din a care este mai mare decat x
    // => pozitia minima
    while(st<dr)
    {
        mij=st+(dr-st)/2;

        if(a[mij]<x)
            st=mij+1;
        else
            dr=mij;
    }
    mij=st+(dr-st)/2;

    if(a[mij] < x)
        mij++;
    return mij;
}

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

    vector<int> d;
    d.push_back(0);
    d.push_back(v[1]);
    p[1]=1;
    for(int i=2; i<=n; i++)
    {
        if(v[i] > d[d.size()-1])
        {
            d.push_back(v[i]);
            p[i]=d.size()-1;
        }
        else
        {
            int poz=cb(d,v[i]);
            d[poz]=v[i];
            p[i]=poz;
        }
    }

    int poz=n;
    vector<int> sol;
    for(int i=d.size()-1;i>=1;i--)
    {
        while(p[poz] != i) poz--;
        sol.push_back(poz);
    }

    out<<d.size()-1<<'\n';
    for(int i=sol.size()-1;i>=0;i--) out<<v[sol[i]]<<' ';
    return 0;
}