Cod sursa(job #1748137)

Utilizator ionanghelinaIonut Anghelina ionanghelina Data 26 august 2016 10:59:54
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.4 kb
#include<bits/stdc++.h>
#define maxN 100005
using namespace std;
deque<int> q;
int v[maxN],m[maxN],pre[maxN],n,dm,ls,ld,sol,mid;
int main()
{
    freopen("scmax.in","r",stdin);
    freopen("scmax.out","w",stdout);
   // m[0]=0;
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&v[i]);
    }
    m[1]=1;
    dm=1;
    for(int i=2;i<=n;i++)
    {
        ls=1;
        ld=dm;
        sol=0;
        while (ls<=ld)
        {
            mid=(ls+ld)>>1;
            if (v[m[mid]]<v[i])
            {
                sol=mid;
                ls=mid+1;
            }
                else ld=mid-1;
        }
        if (!sol)
        {
            if (v[i]<v[m[1]])
            {
                m[1]=i;
                pre[i]=0;
            }
        }
            else
        if (sol==dm)
        {
            dm++;
            m[dm]=i;
           // pre[dm]=m[dm-1];
           pre[i]=m[dm-1];
        }
            else
        if (v[i]<v[m[sol+1]])
        {
            m[sol+1]=i;
            //pre[sol+1]=m[sol];
            pre[i]=m[sol];
        }
    }
    printf("%d\n",dm);
    int ind=m[dm];
    int j=v[ind];
    while (j>0)
    {
        q.push_back(j);
        ind=pre[ind];
        j=v[ind];
    }
    while (!q.empty())
    {
        printf("%d ",q.back());
        q.pop_back();
    }
    printf("\n");
    return 0;
}