Cod sursa(job #1945925)

Utilizator tqmiSzasz Tamas tqmi Data 29 martie 2017 19:24:13
Problema Subsir crescator maximal Scor 15
Compilator cpp Status done
Runda Arhiva educationala Marime 1.1 kb
#include <iostream>
#include <fstream>
#include <stack>
using namespace std;
ifstream fin("scmax.in");
ofstream fout("scmax.out");

const int Nmax=100005;
int N,X[Nmax],pre[Nmax],D[Nmax],poz,L;
stack <int> st;

void read()
{
    fin>>N;
    for(int i=1;i<=N;i++)
    {
        fin>>X[i];
    }
}

void solve()
{
    X[0]=1<<30;
    for(int i=1;i<=N;i++)
    {
        int st=1;
        int dr=L;
        poz=0;
        while(st<=dr)
        {
            int mid=(st+dr)/2;
            if(X[D[mid]]<X[i])
            {
                poz=mid;
                st=mid+1;
            }
            else
            {
                dr=mid-1;
            }
        }
        if(X[i]<X[D[poz+1]])
        {
            D[poz+1]=i;
            pre[D[poz+1]]=D[poz];
            L=max(L,poz+1);
        }
    }
    poz=D[L];
    fout<<L<<"\n";
    while(pre[poz])
    {
        st.push(X[poz]);
        poz=pre[poz];
    }
    while(!st.empty())
    {
        fout<<st.top()<<" ";
        st.pop();
    }
}


int main()
{
    read();
    solve();
    return 0;
}