Cod sursa(job #2196605)

Utilizator SherlockHolmesB221Sherlock Holmes SherlockHolmesB221 Data 19 aprilie 2018 20:18:01
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.16 kb
#include <iostream>
#include <fstream>
#define lim 100005
using namespace std;
ifstream in("scmax.in");
ofstream out("scmax.out");
int v[lim], poz[lim], ult[lim], i, n, lung, rs, smax[lim], k;

int cautare_binara(int st, int dr, int val)
{
    int mij;
    while(st<=dr)
    {
        mij=(st+dr)/2;
        if(v[poz[mij]]>=val)
        {
            dr=mij-1;
        }
        else
        {
            st=mij+1;
        }
    }
    return st;
}
int main()
{
    in>>n;
    for(i=1; i<=n; ++i)
    {
        in>>v[i];
    }
    poz[1]=1;
    lung=1;
    for(i=2; i<=n; ++i)
    {
        rs=cautare_binara(1, lung, v[i]);
        poz[rs]=i;
        if(rs==1)
        {
            ult[i]=0;
        }
        else
        {
            ult[i]=poz[rs-1];
        }
        lung=max(lung, rs);

    }
    out<<lung<<"\n";
    /*for(i=1; i<=lung; ++i)
        out<<poz[i]<<" ";
    out<<'\n';
    for(i=1; i<=n; ++i)
        out<<ult[i]<<" ";
    out<<'\n';*/
    for(i=poz[lung]; ult[i]!=0; i=ult[i])
    {
        smax[++k]=v[i];
    }
    smax[++k]=v[i];
    for(i=k; i>=1; --i)
        out<<smax[i]<<" ";
    return 0;
}