Cod sursa(job #1933250)

Utilizator Corneliu10Dumitru Corneliu Corneliu10 Data 20 martie 2017 16:27:37
Problema Subsir crescator maximal Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 1.08 kb
#include <cstdio>
#include <cstring>
#define NMAX 100003

using namespace std;

int v[NMAX],L[NMAX],R[NMAX],nr;

void afis(int pos)
{
    if(R[pos]!=-1)
       afis(R[pos]);

    printf("%d ",v[pos]);
}

int bs(int l,int r,int x)
{
    int m = (l+r)/2;
    while(l<r)
    {
        if(x >= v[L[m]])
        {
            l = m + 1;
        }
        else
        {
            r = m;
        }
        m = (l+r)/2;
    }

    return l;
}

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

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

    memset(R,-1,sizeof(R));
    L[nr] = 0;

    for(i=1;i<n;i++)
    {
        if(v[i]>v[L[nr]])
        {
            L[++nr] = i;
            R[i] = L[nr-1];
        }
        else if(v[i]<v[L[0]])
        {
            L[0] = i;
        }
        else
        {
            pos = bs(0,nr,v[i]);
            L[pos] = i;
            if(pos>0)R[i] = L[pos - 1];
        }
    }
    printf("%d\n",nr+1);
    afis(L[nr]);
}