Cod sursa(job #2462647)

Utilizator andaraluca2001Anda Epure andaraluca2001 Data 27 septembrie 2019 18:14:33
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.89 kb
#include <fstream>
using namespace std;
//l[i]=liungimea celui mai lung subsir crescator care se termina pe pozitia i

//l[i]=1+max(l[j] cu proprietatile: o<j<i si v[j]<v[i]
const int MAX=100006;
int a[MAX],n,pred[MAX],pozmin[MAX],lmax,l;
ifstream in("scmax.in");
ofstream out("scmax.out");

int cautbinar(int val)
{
    int r=0;
    int pas=1<<16;

    while(pas!=0)
    {
        if(r+pas<=lmax && a[pozmin[r+pas]]<val) r+=pas;
        pas/=2;
    }

    return r;
}

void subsir(int p)
{
    if(pred[p]!=0) subsir(pred[p]);
    out<<a[p]<<" ";
}
int main()

{

    in>>n;
    for(int i=1; i<=n; i++) in>>a[i];
    //imax=1;
    pozmin[++lmax]=1;
    for(int i=2; i<=n; i++)
    {
        l=cautbinar(a[i]);
        pred[i]=pozmin[l];
        if(l+1>lmax) lmax=l+1;
        pozmin[l+1]=i;
    }

    out<<lmax<<'\n';

    subsir(pozmin[lmax]);

    return 0;

}