Cod sursa(job #2360845)

Utilizator FrequeAlex Iordachescu Freque Data 2 martie 2019 10:51:53
Problema Subsir crescator maximal Scor 65
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.76 kb
#include <bits/stdc++.h>
#define ios ios::sync_with_stdio(0); cin.tie(NULL); cout.tie(NULL)
#define pb push_back
#define mp make_pair
#define fi first
#define se second
#define enter cout << '\n'

using namespace std;

typedef long long ll;
typedef pair <int, int> pii;
typedef pair <ll, ll> pll;
typedef vector <int> vi;
typedef vector <pii> vii;
typedef vector <ll> vl;
typedef vector <pll> vll;
typedef queue <int> qi;
typedef queue <pii> qii;
typedef queue <ll> ql;
typedef queue <pll> qll;

const int INF = 0x3f3f3f3f;
const int MOD = 1e9 + 9;
const double EPSILON = 1e-10;
const int NMAX = 1e5 + 5;

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

stack <int> ans;
int n, lungime;
int v[NMAX], indice[NMAX], father[NMAX];

int bin_search(int x)
{
    int st = 1, dr = lungime, mijl, sol = 0;

    while (st <= dr)
    {
        mijl = (st + dr) / 2;
        if (v[x] > v[indice[mijl]])
        {
            st = mijl + 1;
            sol = mijl;
        }
        else
            dr = mijl - 1;
    }

    return sol + 1;
}

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

    indice[1] = 1;
    lungime = 1;

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

    int index = lungime;

    while (indice[index])
        ans.push(v[indice[index--]]);

    fout << ans.size() << '\n';
    while (!ans.empty())
    {
        fout << ans.top() << " ";
        ans.pop();
    }

    return 0;
}