Cod sursa(job #3003598)

Utilizator RobertlelRobert Robertlel Data 15 martie 2023 20:08:59
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.93 kb
#include <iostream>
#include <set>
#include <fstream>
#include <algorithm>

using namespace std;

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


int n , i , m , x , y , arb[600005] , val , maxim , sol[600005] , solfin[600005] , cnt , init[100005];

struct manevra{
int first , second;
}v[600005];

bool cmp (manevra a , manevra 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 left , int right , int poz , int val)
{
    if (left == right)
    {
        arb[nod] = val;
        sol[poz] = val;
        return;
    }
    int mij = (left + right) / 2;
    if (poz <= mij)
        update (2 * nod , left , mij , poz , val);
    else
        update (2 * nod + 1 , mij + 1 , right , poz , val);
    arb[nod] = max (arb[2 * nod] , arb[2 * nod + 1]);
}

void querry (int nod , int left , int right , int ql , int qr)
{
    if (ql <= left && right <= qr)
    {
        maxim = max (maxim , arb[nod]);
        return;
    }
    int mij = (left + right) / 2;
    if (ql <= mij)
        querry (2 * nod , left , mij , ql , qr);
    if (qr > mij)
        querry (2 * nod + 1 , mij + 1 , right , ql , qr);
}

int main()
{
    f >> n;
    for (int 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 (int i = 1 ; i <= n ; i++)
    {
        int poz = v[i].second - 1;
        maxim = 0;
        if (poz)
        querry (1 , 1 , n , 1 , poz);
        val = maxim + 1;
        update (1 , 1 , n , poz + 1 , val);
    }
    g << arb[1] << '\n';
    maxim = arb[1];
    for (int i = n ; i >= 1 ; i--)
    {
        if (sol[i] == maxim)
            solfin[++cnt] = init[i] , maxim--;
    }
    for (int i = cnt ; i >= 1 ; i--)
        g << solfin[i] <<" ";
    return 0;
}