Cod sursa(job #2180454)

Utilizator victorv88Veltan Victor victorv88 Data 20 martie 2018 21:28:38
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.13 kb
#include <iostream>
#include <fstream>

using namespace std;

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

int n, a[100005], valori[100005], pozitii[100005], poz,t=0;
int v;
int cautare(int x)
{
    int st=1, dr=t, mij;
    if (t==0)
        return -1;
    while (st<=dr)
    {
        mij=(st+dr)/2;
        if (valori[mij]>=x)
        {
            poz=mij;
            dr=mij-1;
        }
        else
            st=mij+1;
    }
    if (st==t+1)
        return -1;
    return poz;
}

void afisrecursiv(int k, int pozitie)
{
    if (k==0)
        return;
    for (int i=pozitie; i>=1; i--)
    {
        if (pozitii[i]==k)
        {
            afisrecursiv(k-1,i-1);
            g << a[i] <<' ';
            return;
        }
    }
}

int main()
{
    f >> n;
    for (int i=1; i<=n; i++)
    {
        f >> a[i];
        v=cautare(a[i]);
        if(v==-1)
        {
            valori[++t]=a[i];
            pozitii[i]=t;
        }
        else
        {
            valori[v]=a[i];
            pozitii[i]=v;
        }
    }
    g << t<<endl;
    afisrecursiv(t,n);
    return 0;
}