Cod sursa(job #1687631)

Utilizator denniscrevusDennis Curti denniscrevus Data 12 aprilie 2016 23:26:08
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.39 kb
#include <fstream>

using namespace std;

int n,v[100003],sol[100003],best[100003],m,maxim,poz,i,ap[100003],mx;

int cautbin(int x)
{
    int start=0;
    int step=1;
    for(; step<=m; step<<=1);
    for(; step; step>>=1)
    {
        int index = step+start;
        if(index>m)
            continue;
        if(sol[index]<x)
            start=index;
    }
    return start;
}

int main()
{
    ifstream f("scmax.in");
    ofstream g("scmax.out");
    f>>n;
    f>>v[1];
    for(i=2;i<=n;i++)
    {
        f>>v[i];
        if(mx<v[i])
            mx=v[i];
    }
    if(mx<v[1])
        mx=v[1];
    sol[1]=v[1];
    best[1]=1;
    m=1;
    for(i=2;i<=n;i++)
    {
        if(v[i]<sol[m])
        {
        poz=cautbin(v[i]);
        sol[poz+1]=v[i];
        best[i]=poz+1;
        }
        else if(v[i]>sol[m])
        {
            m++;
            sol[m]=v[i];
            best[i]=m;
        }
    }
    maxim=0;
    poz=0;
    for(i=1;i<=n;i++)
    {
        if(best[i]>maxim)
            maxim=best[i];
    }
    g<<maxim;
    if(maxim>1)
    {
    for(i=n;i>=1;i--)
    {
        if((best[i]==maxim) && (ap[maxim]==0))
        {
            ap[maxim]=v[i];
            maxim--;
        }
    }
    g<<"\n";
    for(i=1;i<=n;i++)
        if(ap[i])
            g<<ap[i]<<" ";
    }
    else
    {
        g<<"\n";
        g<<mx;
    }
}