Cod sursa(job #1888567)

Utilizator DeleDelegeanu Alexandru Dele Data 22 februarie 2017 10:51:59
Problema Subsir crescator maximal Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 1.46 kb
#include <fstream>
using namespace std;
ifstream f("scmax.in");
ofstream g("scmax.out");
int n,i,j,maxf,p,u,m,t,k,nr,ma,a[100001],b[100001],c[100001],s[100001];
int main()
{
    f>>n;
    f>>a[1];
    b[1]=1;
    c[1]=a[1];
    m=1;
    for(i=2 ; i<=n ; ++i)
    {
        f>>a[i];
        if(a[i]<c[1])
        {
            b[i]=1;
            c[1]=a[i];
        }
        else
            if(a[i]>c[m])
        {
            b[i]=m+1;
            c[m+1]=a[i];
            m++;
        }
        else
    {
        p=1;
        u=m;
        while(p<=u)
        {
            k=(p+u)/2;
            if(c[k]<=a[i]&&c[k+1]>a[i])
            {
                t=k;
                break;
            }
            else
                if(a[i]<c[k])u=k-1;
            else
                p=k+1;
        }
        b[i]=t+1;
        c[t+1]=a[i];
    }
    }

   /* g<<"b: ";
    for(i=1 ; i<=n ; ++i)
      g<<b[i]<<" ";
    g<<'\n';
    g<<"c: ";
    for(i=1 ; i<=m ; ++i)
        g<<c[i]<<" ";*/

    ma=0;
    p=0;
    for(i=n ; i>=1 ; --i)
        if(b[i]>ma)
    {
        ma=b[i];
        p=i;
    }
    g<<ma<<'\n';
    nr=0;
    while(ma>0)
    {
        nr++;
        s[nr]=a[p];
        for(j=p-1 ; j>=1 ; --j)
            if(a[p]>a[j]&&b[j]==ma-1)
        {
            p=j;
            break;
        }
        ma--;
    }
    for(i=nr ; i>=1 ; --i)
        g<<s[i]<<" ";
    g<<'\n';
    return 0;
}