Cod sursa(job #2268157)

Utilizator AlexTheDagonBogdan Tudor AlexTheDagon Data 24 octombrie 2018 15:34:59
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.05 kb
#include <iostream>
#include <fstream>
#include <vector>
#define NM 100005
#define inf (1<<30)
using namespace std;

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

int n,a[NM];
int dp[NM];      ///dp[i]-lmax a unui sir ce se termina pe poz i
int pred[NM];    ///pred[i]-predecesorul lui i
int scmax[NM],lmax,poz_sol,poz_scmax[NM];
vector<int> sol;


int main()
{
    in>>n;
    for(int i=1;i<=n;++i)in>>a[i];
    for(int i=1;i<=n;++i)scmax[i]=inf;
    for(int i=1;i<=n;++i)
    {
        int poz=0;
        for(int j=(1<<20);j>0;j/=2)
            if(poz+j<=lmax && scmax[poz+j]<a[i])
                poz+=j;
        ++poz;
        if(poz==lmax+1)
        {
            ++lmax;
            poz_sol=i;
        }
        dp[i]=lmax;
        pred[i]=poz_scmax[poz-1];
        scmax[poz]=a[i];
        poz_scmax[poz]=i;
    }
    while(poz_sol>0)
    {
        sol.push_back(a[poz_sol]);
        poz_sol=pred[poz_sol];
    }
    out<<sol.size()<<'\n';
    for(int i=sol.size()-1;i>=0;--i)out<<sol[i]<<" ";
    return 0;
}