Cod sursa(job #2141564)

Utilizator IustinPetrariuIustinian Petrariu IustinPetrariu Data 24 februarie 2018 14:13:45
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.21 kb
#include <iostream>
#include <fstream>
#include <vector>
#define nmax 100001
using namespace std;
ifstream fin("scmax.in");
ofstream fout("scmax.out");
vector< int > previous,BEST,a;
int N,bmax;
void buildSolution(int last)
{
    if(last>0)
    {
        buildSolution(previous[last]);
        fout<<a[last]<<" ";
    }
}
void write()
{
    fout<<BEST.size()-1<<'\n';
    buildSolution(BEST.back());
    fout<<endl;
}
int binarySearch(int st,int dr,int val)
{
    int mij;
    while(st<=dr)
    {
        mij=(st+dr)/2;
        if(val>a[BEST[mij]])
        {
            st=mij+1;
            bmax=mij;
        }
        else dr=mij-1;
    }
    return bmax;
}
void solve()
{
    for(int i =2 ; i <= N; i++)
        if(a[i] > a[BEST.back()])
    {
        previous[i]=BEST[BEST.size()-1];
        BEST.push_back(i);
    }
    else
    {
        bmax=binarySearch(0,BEST.size()-1,a[i]);
        BEST[bmax+1]=i;
        previous[i]=BEST[bmax];
    }
}

void read()
{
    fin>>N;
    a.assign(N+1,0);
    previous.assign(N+2,0);
    BEST.assign(2,0);
    for(int i =1 ; i <= N; i++)
        fin>>a[i];
    BEST[1]=1;

}
int main()
{
    read();
    solve();
    write();

}