Cod sursa(job #2172578)

Utilizator RickSanchezRick Sanchez RickSanchez Data 15 martie 2018 17:01:10
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.14 kb
#include <bits/stdc++.h>

using namespace std;
ifstream fin("scmax.in");
ofstream fout("scmax.out");
const int nmax = 100005;
int N,K;
int v[nmax], lst[nmax], dp[nmax];

inline void Read()
{
    fin >> N;
    for(int i = 1; i <= N; i++)
        fin >> v[i];
}

inline int BS(int x)
{
    int st,dr,mid,ans;
    st = 1; dr = K;
    while(st <= dr)
    {
        mid = (st + dr) / 2;
        if(v[dp[mid]] >= x)
        {
            ans = mid;
            dr = mid-1;
        }
        else st = mid+1;

    }
    return ans;
}


inline void Rec(int poz)
{
    if(poz == 0) return;
    int x = v[poz];
    poz = lst[poz];
    Rec(poz);
    fout << x << " ";
}


inline void Solve()
{
    int i,p;
    for(i = 1; i <= N; i++)
    {
        if(v[i] > v[dp[K]])
        {
            dp[++K] = i;
            lst[i] = dp[K-1];
        }
        else if(v[i] < v[dp[1]]) dp[1] = i;
        else
        {
            p = BS(v[i]);
            dp[p] = i;
            lst[i] = dp[p-1];
        }
    }
    fout << K << "\n";
    Rec(dp[K]);
}


int main()
{
    Read();
    Solve();
    return 0;
}