Cod sursa(job #2306418)

Utilizator qwerty63Andrei Farcasanu qwerty63 Data 22 decembrie 2018 12:10:39
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.24 kb
#include <bits/stdc++.h>

using namespace std;
ifstream fin ("scmax.in");
ofstream fout("scmax.out");
int v[100001],i,n,ml[100001],rez[100001],VALMAX=2000000000,submax,lungc,lungmax[100001],lelemc,nr,j;
int cb(int val,int pozmax)
{
    int st,dr,med,last;
    st=1;
    dr=pozmax;
    last=0;
    while(st<=dr)
    {
        med=(st+dr)/2;
        if(ml[med]<val)
        {
            last=med;
            st=med+1;
        }
        else dr=med-1;
    }
    return last;
}
int main()
{

    submax=0;
    fin>>n;
    for(i=1; i<=n; i++)
    {
        fin>>v[i];
        ml[i]=VALMAX+1;
    }
  /*  memset(lungmax,1,n);
    for(i=1; i<=n; i++)
        for(j=1; j<i; j++)
            if(v[j]<=v[i])
                if(lungmax[j]+1>lungmax[i])
                    lungmax[i]=lungmax[j]+1;*/
    for(i=1; i<=n; i++)
    {
        lungc=cb(v[i],submax);
        if(ml[lungc+1]>v[i])ml[lungc+1]=v[i];
        lungmax[i]=lungc+1;
        if(lungc+1>submax)submax=lungc+1;

    }
    lelemc=submax;
    nr=0;
    for(i=n; i>=1; i--)
        if(lelemc==lungmax[i])
        {
            rez[++nr]=v[i];
            lelemc--;
        }
    fout<<nr<<endl;
    for(i=nr; i>=1; i--) fout<<rez[i]<<' ';
    return 0;
}