Cod sursa(job #2712469)

Utilizator Uriesu_IuliusUriesu Iulius Uriesu_Iulius Data 25 februarie 2021 19:51:08
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.12 kb
#include <bits/stdc++.h>

using namespace std;

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

int n;
int v[100001], dp[100001], p[100001], ans[100001];
int k;

void Citire()
{
    int i;
    fin >> n;
    for(i=1; i<=n; i++)
        fin>>v[i];
}

int binarySearch(int st, int dr, int x)
{
    int poz=dr+1;
    while(st<=dr)
    {
        int m=(st+dr)/2;
        if(dp[m]>=x)
        {
            poz=m;
            dr=m-1;
        }
        else
            st=m+1;
    }
    return poz;
}

void Construire()
{
    int i;
    for(i=1; i<=n; i++)
        if(v[i]>dp[k])
        {
            dp[++k]=v[i];
            p[i]=k;
        }
        else
        {
            int poz=binarySearch(1, k, v[i]);
            dp[poz]=v[i];
            p[i]=poz;
        }
}

void Afisare()
{
    int i, j;
    j=n;
    for(i=k; i>=1; i--)
    {
        while(p[j]!=i)
            j--;
        ans[i]=v[j];
    }
    fout << k << "\n";
    for(i=1; i<=k; i++)
        fout << ans[i] << " ";
}

int main()
{
    Citire();
    Construire();
    Afisare();
    return 0;
}