Cod sursa(job #2517530)

Utilizator AndreiD31Dragan Andrei AndreiD31 Data 3 ianuarie 2020 18:09:17
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.23 kb
#include <bits/stdc++.h>

using namespace std;

ifstream f("scmax.in");
ofstream g("scmax.out");

int n,i,poz,lmax,mij,p,u ,l[100100],v[100100],a[10010];

void afisare(int indice)
{
    if(indice>=1 && lmax>0)
    {
        if(l[indice]==lmax)
        {
            lmax--;
            afisare(indice-1);
            g<<v[indice]<<" ";
        }
        else
        {
            afisare(indice-1);
        }
    }
}

int main()
{
    f>>n;
    for(i=1;i<=n;i++)f>>v[i];

    a[1]=v[1];
    a[0]=1;
    l[1]=1;

    for(i=2;i<=n;i++)
    {
        if(v[i]>a[a[0]])
        {
            a[0]++;
            a[a[0]]=v[i];
            l[i]=a[0];
        }
        else
        {
            /// caut primul numar mai mare sau egal decat v[i] si ii dau replace cu v[i](primul incepand cautarea din stanga)
            p=1;u=a[0];poz=-1;
            while(p<=u)
            {
                mij=(p+u)/2;
                if(a[mij]>=v[i]){poz=mij;u=mij-1;}
                else p=mij+1;
            }

            if(poz!=-1)
            {
                a[poz]=v[i];
                l[i]=poz;
            }
        }
    }

    lmax=a[0];
    g<<lmax<<'\n';
    afisare(n);
    return 0;
}