Cod sursa(job #3210532)

Utilizator lazureanrLazurean Razvan lazureanr Data 6 martie 2024 15:52:27
Problema Subsir crescator maximal Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.51 kb
#include <iostream>
#include <fstream>
#include <algorithm>

using namespace std;

ifstream fin("scmax.in");
ofstream fout("scmax.out");

int n,a[100005],ult[100005],poz[100005],nr;

int binar(int val)
{
    int st=1,dr=nr;
    int m=(st+dr)/2;
    while(st<=dr)
    {
        if(a[m]<val && a[m+1]>=val)
        {
            return m;
        }
        else
        {
            if(a[m+1]<val)
            {
                st=m+1;
                m=(st+dr)/2;
            }
            else
            {
                dr=m-1;
                m=(st+dr)/2;
            }
        }
    }
    return nr;
}

int main()
{
    fin>>n;
    for(int i=1;i<=n;i++)
    {
        fin>>a[i];
    }
    poz[1]=1;
    ult[1]=a[1];
    nr=1;
    for(int i=2;i<=n;i++)
    {
        int pozition=binar(a[i]);
        //cout<<pozition<<endl;
        //cout<<pozition<<" "<<ult[pozition]<<" "<<a[i]<<endl;
        poz[i]=pozition;
        if(pozition<nr && ult[pozition]>a[i])
        {
            ult[pozition]=a[i];
        }
        else
        {
            if(pozition==nr)
            {
                if(a[i]>ult[nr])
                {
                    nr++;
                    ult[nr]=a[i];
                    poz[i]++;
                }
                else
                {
                    ult[nr]=a[i];
                }
            }
        }
    }
    fout<<nr<<'\n';
    for(int i=1;i<=nr;i++)
    {
        fout<<ult[i]<<" ";
    }
    return 0;
}