Cod sursa(job #1804180)

Utilizator GoogalAbabei Daniel Googal Data 12 noiembrie 2016 12:00:41
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.92 kb
#include <fstream>
#include <iostream>
#define nmax 200001

using namespace std;

ifstream fin("scmax.in");
ofstream fout("scmax.out");

int n,a[nmax],b[nmax],poz[nmax],i,m,pas;

inline void read()
{
    fin>>n;
    for(i=1; i<=n; i++)
        fin>>a[i];
    fin.close();
}

int cauta(int x)
{
    pas=1<<18;
    int r=0;
    while(pas!=0)
    {
        if(r+pas<=m && a[b[r+pas]]<x)
            r+=pas;
        pas/=2;
    }
    return r;
}

void write(int x)
{
    if(x>0)
        {
            write(poz[x]);
            fout<<a[x]<<' ';
        }

}

inline void solve()
{
    int k;
    b[++m] = 1;
    for(i=2; i<=n; i++)
    {
        poz[i]=0;
        k=cauta(a[i]);
        k++;
        poz[i]=b[k-1];
        b[k]=i;
        if(k>m)
        {
            m=k;
        }
    }
}

int main()
{
    read();
    solve();
    fout<<m<<'\n';
    write(b[m]);
    return 0;
}