Cod sursa(job #1776489)

Utilizator rares00Foica Rares rares00 Data 11 octombrie 2016 13:16:51
Problema Subsir crescator maximal Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.34 kb
#include <iostream>
#include <fstream>
#define L 100
using namespace std;
ifstream in("date.in");
ofstream out("date.out");

int n,v[L];
int nr,c[L],p[L];
/*
    v[i]<c[1]
    v[i]>c[nr]
    else
*/

int bs(int st,int dr,int z)
//cauta un element >z, pe pozitia cea mai mare
{
    int mij = st + (dr-st)/2;
    if(c[mij]<z)
        bs(mij+1,dr,z);
    else //c[mij]>=v[i]
    {
        if(mij==1)//nu avem elemente in stanga
            return mij;
        else if(c[mij-1]>=z)
            bs(st,mij-1,z);
        else
            return mij;
    }
}

int main()
{
    //citire
    in>>n;
    for(int i=1;i<=n;++i)
        in>>v[i];
    //determina vector pozitii (P)
    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])
        {
            c[++nr]=v[i];
            p[i]=nr;
        }
        else
        {
            int poz = bs(1,nr,v[i]);
            c[poz]=v[i];
            p[i]=poz;
        }
    }
    //calculeaza si afiseaza celMaiLungSubsirCrescator
    int st[L],vf=0;
    int z=nr,i=n;
    while(z>0)
    {
        while(p[i]!=z)
            --i;
        st[++vf]=v[i];
        --z;
    }
    //afisare
    out<<nr<<"\n";
    while(vf>0)
        out<<st[vf]<<" ", --vf;

    return 0;
}