Cod sursa(job #2047018)

Utilizator onescu.iancuOnescu Iancu onescu.iancu Data 24 octombrie 2017 14:40:23
Problema Subsir crescator maximal Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.24 kb
#include <iostream>
#include <cstdio>

using namespace std;

int n, a[100001], tata[100001], sub[100001], lmax=1;

void Citire()
{
    scanf("%d\n", &n);
    for(int i=1; i<=n; i++)
        scanf("%d ", &a[i]);
}

int Cautare(int x, int nr)
{
    int st=1, dr=nr;
    int mij=(st+dr)/2;
    while(mij<dr)
    {
        if(a[sub[mij]]<x && a[sub[mij+1]]>=x)
            return mij+1;
        else if(a[sub[mij]]>x)
        {
            dr=mij-1;
            mij=(st+dr)/2;
        }
        else{
            st=mij+1;
            mij=(dr+st)/2;
        }
    }
}


void Afisare(int i)
{
    if(tata[i]>0) Afisare(tata[i]);
    cout<<a[i]<<" ";
}

void CreareSub()
{
    for(int i=2; i<=n; i++)
    {
        if(a[i]>a[sub[lmax]])
            {
                sub[++lmax]=i;
                tata[i]=sub[lmax-1];
            }
        else if(a[i]<a[sub[1]])
            sub[1]=i;
        else {
        int m=Cautare(a[i], lmax-1);
        sub[m]=i;
        tata[i]=sub[m-1];
        }
    }
    cout<<lmax<<endl;
    Afisare(sub[lmax]);
}

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

    Citire();
    sub[1]=1;
    CreareSub();
    return 0;
}