Cod sursa(job #2470188)

Utilizator mihailescu_eduardMihailescu Eduard-Florin mihailescu_eduard Data 8 octombrie 2019 20:28:34
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.29 kb
//#pragma GCC optimize ("O3")
//#pragma GCC target ("sse4")

#include <bits/stdc++.h>

using namespace std;

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

static const int NMAX = 1e5+5;


int ind[NMAX];
int v[NMAX];
int previous[NMAX];
int n;
int sz =0;

void ConstructSubstring()
{
    for(int i =1; i<=n; ++i)
    {
        if(v[i] > v[ind[sz]])
        {
            ind[++sz] = i;
            previous[i] = ind[sz-1];
        }
        else
        {
            int low = 1, high = sz, mid, sol=1;
            while(low <= high)
            {
                
                mid = low + (high - low) /2;
                if(v[i] <= v[ind[mid]])
                {
                    sol = mid;
                    high = mid -1;
                }
                else
                {
                    low = mid+1;
                }
            }
            ind[sol] = i;
            previous[i] = ind[sol-1];
        }
    }
}

int main()
{
    fin >> n;
    for(int i =1; i<=n; ++i)
    {
        fin >> v[i];
    }
    ConstructSubstring();

    vector<int> sol;
    int x = ind[sz];
    while(x)
    {
        sol.push_back(v[x]);
        x = previous[x];
    }
    fout << sz << '\n';
    for(int i = (int) sol.size() - 1; i>= 0; i--)
    {
        fout << sol[i] << " ";
    }

    return 0;
}