Cod sursa(job #2155443)

Utilizator sotoc1999Sotoc George sotoc1999 Data 7 martie 2018 20:49:33
Problema Subsir crescator maximal Scor 55
Compilator cpp Status done
Runda Arhiva educationala Marime 1.23 kb
#include <iostream>
#include <fstream>
using namespace std;
ifstream f("scmax.in");
ofstream g("scmax.out");
int n;
int v[100003],p[100003],c[100003],sol[100003];
int m;
int cautare_binara(int st,int dr,int i)
{
    m=st+(dr-st)/2;
    if(c[m]<v[i])
    {
        return cautare_binara(m+1,dr,i);
    }
    else if(c[m]>v[i])
    {
        if(c[m-1]>=v[i])
            return cautare_binara(st,m-1,i);
        else
            return m;
    }
}
int main()
{
    int poz;
    f>>n;
    for(int i=1;i<=n;i++)
        f>>v[i];
    c[1]=v[1];
    p[1]=1;
    int nr=1;
    for(int i=1;i<=n;i++)
    {
        if(v[i]<=c[1])
        {
            c[1]=v[i];
            p[i]=1;
        }
        else if(v[i]>c[nr])
        {
            nr++;
            c[nr]=v[i];
            p[i]=nr;
        }
        else
        {
            //cauta cel mai mic element mai mare
            poz=cautare_binara(1,nr,i);
            c[poz]=v[i];
            p[i]=p[poz];
        }
    }
    int aux=nr;
    g<<nr<<"\n";
    for(int i=n;i>=1;i--)
    {
        if(p[i]==nr)
        {
            sol[nr]=v[i];
            nr--;
        }
    }
    for(int i=1;i<=aux;i++)
        g<<sol[i]<<" ";
    return 0;
}