Cod sursa(job #2241509)

Utilizator ptudortudor P ptudor Data 16 septembrie 2018 11:17:34
Problema Subsir crescator maximal Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.09 kb
#include <bits/stdc++.h>
using namespace std;
int n,dp[100001],a[100001],v[100001],k=0;
int cautbin(int st,int dr,int x);
stack <int> st;
int main()
{int i,x,poz;
    ifstream in("scmax.in");
    ofstream out("scmax.out");
    in>>n;
    for (i=1;i<=n;i++)
    {
        in>>a[i];
    }
    for (i=1;i<=n;i++)
    {
        if (a[i]>a[dp[k]])
        {
            dp[++k]=i;
            v[a[i]]=dp[k-1];
        }
        else
        {
            poz=cautbin(1,k,a[i]);
            dp[poz]=i; ///cea mai din stanga pozitie mij>=x
            v[a[i]]=dp[poz-1];
        }
    }
    poz=dp[k];
    out<<k<<"\n";
    v[4];
    while (k>0)
    {
        st.push(a[poz]);
        poz=v[a[poz]];
        k--;
    }
    while (!st.empty())
    {
        out<<st.top()<<" ";
        st.pop();
    }
    out<<"\n";
}
int cautbin(int st,int dr,int x)
{int mij,last;
    while (st<=dr)
    {
        mij=(st+dr)/2;
        if (a[dp[mij]]>=x)
        {
            last=mij;
            dr=mij-1;
        }
        else
            st=mij+1;
    }
    return last;
}