Cod sursa(job #2445429)

Utilizator cpopescu1Popescu Cristian cpopescu1 Data 4 august 2019 01:08:33
Problema Subsir crescator maximal Scor 60
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.93 kb
#include<bits/stdc++.h>

using namespace std;

ifstream fin("scmax.in");
ofstream fout("scmax.out");

int n,v[100005],b[100005];
vector <int> sol;
int cauta(int st,int dr,int val)
{
    while(st<dr)
    {
        int mij=dr-(dr-st)/2;
        if(val<b[mij])
        {
            st=mij;
        }
        else{

            dr=mij-1;
        }
    }
    return st;
}

void citire()
{
    fin>>n;
    for(int i=1;i<=n;i++)
        fin>>v[i];
}

void dinamica()
{
    int lung_max=0;

    for(int i=n;i>=1;i--)
    {
        int k=cauta(0,lung_max,v[i]);
        if(k==lung_max)
        {
            b[++lung_max]=v[i];
            sol.push_back(v[i]);
        }
        else if(v[i]>b[k+1])
        {
            b[k+1]=v[i];
        }
    }
    fout<<lung_max<<"\n";
    for(int i=sol.size()-1;i>=0;i--)
        fout<<sol[i]<<" ";
}

int main()
{
    citire();
    dinamica();
    return 0;
}