Cod sursa(job #2927124)

Utilizator RobertlelRobert Robertlel Data 19 octombrie 2022 16:21:32
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.24 kb
#include <fstream>
#include <algorithm>

using namespace std;

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

pair < int , int > v[600005];

int n , i , maxim , poz , cnt;

int init[100005] , best[600005] , best1[600005] , b[100005];

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 left , int right , int poz , int val)
{
    if (left == right)
    {
        best[nod] = val;
        best1[poz] = val;
        return;
    }
    int mij = (left + right) / 2;

    if (poz <= mij)
        update (2 * nod , left , mij , poz , val);
    else
        if (poz > mij)
        update (2 * nod + 1 , mij + 1 , right , poz , val);
    best[nod] = max (best[2 * nod] , best[2 * nod + 1]);
}

void querry (int nod , int left , int right , int ql , int qr)
{
    if (ql <= left && qr >= right)
    {
        maxim = max (maxim , best[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 (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++)
    {
        maxim = 0;
        int left = v[i].second - 1;
        int right = 1;
        if(right <= left)
        querry(1 , 1 , n , right , left);

        int val = maxim + 1;
        int poz = v[i].second;

        update(1 , 1 , n , poz , val);
    }


    g << best[1] << '\n';

    maxim = 0;
    for (i = 1 ; i <= n ; i++)
    {
        if (best1[i] >= maxim)
           {
               maxim = best1[i];
               poz = init[i] ;
           }
    }

    for (int i = n ; i >= 1 ; i--)
    {
        if (best1[i] == maxim && init[i] <= poz)
        {
            cnt++;
            b[cnt] = init[i];
            maxim--;
            poz = init[i];
        }
    }

    for(i = cnt ; i >= 1 ; i--)
        g << b[i] << " ";
    return 0;
}