Cod sursa(job #1505890)

Utilizator aaron72Armand Ioan Anusca Popa aaron72 Data 19 octombrie 2015 20:42:01
Problema Subsir crescator maximal Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.23 kb
#include <bits/stdc++.h>
#define lim 100005

using namespace std;

int n,a[lim],lis[lim],poz[lim],k;

inline void Read()
{
    int i;
    ifstream fin("scmax.in");
    fin>>n;
    for(i=1;i<=n;i++)
        fin>>a[i];
    fin.close();
}

inline int Binar_Search(int x)
{
    int st=1,dr=2,m=0,sol=k;
    while(st<=dr)
    {
        m=(st+dr)/2;
        if(lis[m]>=x)
        {
            sol=m;
            dr=m-1;
        }
            else if(lis[m]<x) st=m+1;
    }
    return sol;
}

inline void LIS()
{
    int i,p,x;
    k=1;
    poz[1]=1;
    lis[1]=a[1];
    for(i=2;i<=n;i++)
    {
        x=a[i];
        if(x>lis[k])
        {
            k++;
            lis[k]=x;
            poz[i]=k;
        }
        else
            if(x<=lis[1])
            {
                lis[1]=x;
                poz[i]=1;
            }
        else
        {
            p=Binar_Search(x);
            lis[p]=x;
            poz[i]=p;
        }
    }
}

inline void Write()
{
    int i;
    ofstream fout("scmax.out");
    fout<<k<<"\n";
    for(i=1;i<=k;i++)
        fout<<lis[i]<<" ";
    fout<<"\n";
    fout.close();
}

int main()
{
    Read();
    LIS();
    Write();
    return 0;
}