Cod sursa(job #2554381)

Utilizator BAlexandruBorgovan Alexandru BAlexandru Data 22 februarie 2020 20:46:45
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.82 kb
#include <fstream>
#include <algorithm>

using namespace std;

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

int n, i;
int poz, val;
int start, finish, maxim;
int best[262144], best1[100001];
int init[100001], aux[100001];
pair < int, int > v[100001];

bool cmp(pair < int, int > a, pair < int, int > b)
{
    if (a.first < b.first)
        return true;
    if (a.first == b.first  &&  a.second > b.second)
        return true;
    return false;
}

void update(int nod, int st, int dr)
{
    if (st == dr)
    {
        best[nod] = val;
        best1[poz] = val;
        return;
    }

    int mij = (st + dr) / 2;
    if (poz <= mij)
        update(nod * 2, st, mij);
    else
        update(nod * 2 + 1, mij + 1, dr);

    best[nod] = max(best[nod * 2], best[nod * 2 + 1]);
}

void query(int nod, int st, int dr)
{
    if (start <= st && dr <= finish)
    {
        maxim = max(maxim, best[nod]);
        return;
    }

    int mij = (st + dr) / 2;
    if (mij >= start)
        query(nod * 2, st, mij);
    if (mij < finish)
        query(nod * 2 + 1, mij + 1, dr);

}

void afisare(int poz, int val, int last)
{
    while (poz > 0 && (best1[poz] != val || init[poz] >= last))
        poz--;
    if (val > 1)
        afisare(poz, val - 1, init[poz]);
    g << init[poz] << " ";
}

int main()
{
    f >> n;
    for (i=1; i<=n; i++)
    {
        f >> init[i];
        v[i].first = init[i];
        v[i].second = i;
    }

    sort(v+1, v+n+1, cmp);

    for (i=1; i<=n; i++)
    {
        start = 1, finish = v[i].second - 1, maxim = 0;
        if (start <= finish)
            query(1, 1, n);

        poz = v[i].second;
        val = maxim + 1;
        update(1, 1, n);
    }

    g << best[1] << "\n";
    afisare(n, best[1], v[n].first + 1);

    return 0;
}