Cod sursa(job #2059111)

Utilizator valentinoMoldovan Rares valentino Data 6 noiembrie 2017 17:42:34
Problema Subsir crescator maximal Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.27 kb
#include <fstream>
#include <stack>
#include <iostream>
#include <algorithm>
#define Nmax 100005
using namespace std;

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

int n, v[Nmax], poz[Nmax], tail[Nmax], k;
stack < int > sol;

int BS(int st, int dr, int val)
{
    int m;
    while(st < dr)
    {
        m = (st + dr) >> 1;
        if(v[ tail[ m ] ] < val) st = m + 1;
        else dr = m - 1;
    }
    if(v[ tail[ st ] ] <= val) return st;
    else return st - 1;
}

int main()//MUE SOPTEREAN
{
    f >> n;
    for(int i = 1; i <= n; ++i) f >> v[ i ];
    tail[ ++k ] = 1;
    for(int i = 2; i <= n; ++i)
    {
        if(v[ i ] > v[ tail[ k ] ])
        {
            poz[ i ] = tail[ k ];
            tail[ ++k ] = i;
        }
        else if(v[ i ] < v[ tail[ 1 ] ])
        {
            tail[ 1 ] = i;
        }
        else
        {
            int p = BS(1, k, v[ i ]);
            if(v[ tail[ p ] ] < v[ i ])
            {
                poz[ i ] = p;
                tail[p + 1] = i;
            }
        }
    }
    int i = tail[ k ];
    while(i)
    {
        sol.push(v[ i ]);
        i = poz[ i ];
    }
    g << k << '\n';
    while(!sol.empty())
    {
        g << sol.top() << ' ';
        sol.pop();
    }
}