Cod sursa(job #2590485)

Utilizator raduandreiRadu Andrei raduandrei Data 28 martie 2020 02:13:52
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.87 kb
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
ifstream in("scmax.in");
ofstream out("scmax.out");
#define N 100005

int n, a[N],d[N],k,p[N],afis[N];
void citire()
{
    in>>n;
    for(int i=1; i<=n; ++i)
        in>>a[i];
}
int cauta(int st, int dr, int x)
{
    int poz;
    while(st<=dr)
    {
        int m=(st+dr)/2;
        if(d[m]>=x)
            poz=m,dr=m-1;
        else st=m+1;
    }
    return poz;
}
void creare()
{
    k=1;
    p[1]=1;
    d[1]=a[1];
    for(int i=2; i<=n; ++i)
        if(a[i]>d[k])
           d[++k]=a[i],p[i]=k;
    else
    {
        int poz=cauta(1,k,a[i]);
        d[poz]=a[i],p[i]=poz;
    }
    out<<k<<endl;
    for(int i=n; i&&k;--i)
        if(p[i]==k)
        afis[k--]=a[i];
    while(afis[++k]) out<<afis[k]<<" ";
}

int main()
{
    citire();
    creare();
    return 0;
}