Cod sursa(job #2085256)

Utilizator MaxTeoTeo Oprescu MaxTeo Data 9 decembrie 2017 21:09:33
Problema Subsir crescator maximal Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.17 kb
#include <bits/stdc++.h>
#define NMAX 100001
using namespace std;

ifstream f("scmax.in");
ofstream g("scmax.out");

int v[NMAX],indice[NMAX],anterior[NMAX],solutie[NMAX];
int n,lungime;

void read()
{
    f>>n;
    for(int i=1;i<=n;++i)
        f>>v[i];
}

int bs(int i)
{
    int pas=1<<16,r=0;
    while(pas)
    {
        if(r+pas<=lungime&&v[r+pas]>v[i])
            r+=pas;
        pas/=2;
    }
    return r;
}

void build()
{
    indice[1]=1;
    lungime=1;
    for(int i=2;i<=n;++i)
    {
        if(v[i]>v[indice[lungime]])
        {
            indice[++lungime]=i;
            anterior[i]=indice[lungime-1];
        }
        else
        {
            int poz=bs(i);
            indice[poz]=i;
            anterior[i]=indice[poz-1];
        }
    }
}

void getSolution()
{
    int poz=lungime,i=indice[lungime];
    while(i)
    {
        solutie[poz]=v[i];
        i=anterior[i];
        --poz;
    }
}

void printSolution()
{
    g<<lungime<<"\n";
    for(int i=1;i<=lungime;++i)
        g<<solutie[i]<<" ";
}

int main()
{
    read();
    build();
    getSolution();
    printSolution();
    return 0;
}