Cod sursa(job #2771671)

Utilizator guzgandemunteIonescu Laura guzgandemunte Data 28 august 2021 16:38:27
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.34 kb
#include <iostream>
#include <fstream>
#define NMAX 100000
using namespace std;
ifstream fin("scmax.in");
ofstream fout("scmax.out");

int binary_leftmost(int a[], int spoz[], int k, int inc, int sf)
{
    int st = inc - 1, dr = sf, mij;
    while (dr - st > 1)
    {
        mij = st + (dr - st) / 2;
        if (k > a[spoz[mij]])
            st = mij;
        else dr = mij;
    }
    return dr;
}

int spoz[NMAX], ans[NMAX], a[NMAX], n, k, lung, rasp[NMAX];

int main ()
{
    fin >> n;
    for (int i = 0; i < n; i++)
        fin >> a[i], ans[i] = -1;
    spoz[0] = 0;
    lung = 1;
    for (int i = 1; i < n; i++)
    {
        if(a[i] < a[spoz[0]])
            spoz[0] = i;

        else if (a[i] > a[spoz[lung - 1]])
        {
            ans[i] = spoz[lung - 1];
            spoz[lung++] = i;
        }

        else
        {
            k = binary_leftmost(a, spoz, a[i], 0, lung - 1);
           // k = GetPosition(a, spoz, -1, lung - 1, a[i]);
            ans[i] = spoz[k - 1];
            spoz[k] = i;
        }

    }

    fout << lung << endl;

    k = spoz[lung - 1];

    for (int i = 0; i < lung; i++)
    {
        rasp[i] = a[k];
        k = ans[k];
    }

    for (int i = lung - 1; i >= 0; i--)
        fout << rasp[i] << " ";

    fin.close();
    fout.close();
    return 0;
}