Cod sursa(job #2180519)

Utilizator VladG26Ene Vlad-Mihai VladG26 Data 20 martie 2018 22:08:01
Problema Subsir crescator maximal Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.01 kb
#include <cstdio>
#include <iostream>
#include <stack>

using namespace std;
int n,vCit[100005],v1[100005],v2[100005];
stack<int> r;
int caut(int st,int dr,int val)
{
    int mij;
    while(st<=dr)
    {
        mij=(st+dr)/2;
        if(v1[mij]<val)
            st=mij+1;
        else
            dr=mij-1;
    }
    mij=(st+dr)/2;
    if(v1[mij]<val)
        return mij+1;
    return mij;
}
int main()
{
    freopen("scmax.in","r",stdin);
    freopen("scmax.out","w",stdout);
    scanf("%d",&n);
    int idx=1,rasp=1;
    v1[1]=0x3f3f3f3f;
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&vCit[i]);
        idx=caut(1,rasp,vCit[i]);
        v1[idx]=vCit[i];
        v2[i]=idx;
        rasp=max(rasp,idx);
    }

    printf("%d\n",rasp);
    for(int i=n;i>=1;i--)
    {
        if(v2[i]==rasp)
        {
            r.push(vCit[i]);
            rasp--;
        }
    }
    while(!r.empty())
    {
        printf("%d ",r.top());
        r.pop();
    }


    return 0;
}