Cod sursa(job #2412051)

Utilizator ionanghelinaIonut Anghelina ionanghelina Data 21 aprilie 2019 16:38:27
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda qsasdasgegs Marime 1.13 kb
#include<bits/stdc++.h>
using namespace std;

const int maxN=(1e5)+5;

int n,pre[maxN],m[maxN],dm;
int v[maxN];
vector<int> sub;

int main()
{
    freopen("scmax.in","r",stdin);
    freopen("scmax.out","w",stdout);


    scanf("%d",&n);

    for(int i=1;i<=n;i++)
        scanf("%d",&v[i]);

    pre[1]=0;

    dm=1;
    m[dm]=1;

    for(int i=2;i<=n;i++)
    {
        int st=1;
        int dr=dm;
        int sol=0;

        while(st<=dr)
        {
            int mid=(st+dr)>>1;
            if(v[m[mid]]<v[i])
            {
                sol=mid;
                st=mid+1;
            }
                else dr=mid-1;
        }

        if(sol==dm)
        {
            pre[i]=m[dm];
            m[++dm]=i;
        }
            else
        if(v[m[sol+1]]>v[i])
        {
            pre[i]=m[sol];
            m[sol+1]=i;

        }

    }

    printf("%d\n",dm);

    int x=m[dm];

    while(x)
    {
        sub.push_back(v[x]);
        x=pre[x];
    }

    reverse(sub.begin(),sub.end());

    for(auto it:sub)
        printf("%d ",it);

    printf("\n");

    return 0;
}