Cod sursa(job #2949352)

Utilizator lucaxsofLuca Sofronie lucaxsof Data 30 noiembrie 2022 14:55:57
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.66 kb
#define _CRT_SECURE_NO_WARNINGS
#include <math.h>
#include <vector>
#include <iomanip>
#include <fstream>
#include <algorithm>
#include <cstring>
#include <stack>
#include <queue>
#include <bitset>
#include <string>
//#include <bits/stdc++.h>
using namespace std;

ifstream cin("scmax.in");
ofstream cout("scmax.out");

#define pb(x) push_back(x)

const int NMAX = 1e6;

int n;

int a[NMAX];

int temp[NMAX]; //in care stochez subsirurile (voi avea indicii de la nr din a[])
int r[NMAX];    //pt care voi zice de pe ce numar vin numerele

int max_len, start_sol;

void read()
{
    cin >> n;
    for (int i = 1; i <= n; ++i)
        cin >> a[i];
}

int bs(int x)
{
    int st = 1, dr = max_len, mid, pos=0;
    while (st <= dr)
    {
        mid = (st + dr) / 2;
        if (a[temp[mid]] < x)
            st = mid + 1, pos = mid;
        else
            dr = mid - 1;
    }
    return pos;
}

void solution()
{
    for (int i = 1; i <= n; ++i)
    {
        int ind = bs(a[i]);     // imi va da indicele dupa care trebuie sa pun nr i (a[i])
        //acum trebuie sa vezi daca la pus la finalul lui temp[]
        if (ind + 1 > max_len)
        {
            max_len = ind + 1;
            start_sol = i;
        }
        temp[ind + 1] = i;
        r[i] = temp[ind];
    }

    vector<int> ans;
    while (start_sol)
    {
        ans.push_back(start_sol);
        start_sol = r[start_sol];
    }
    reverse(ans.begin(), ans.end());
    cout << max_len << '\n';
    for (auto i : ans)
        cout << a[i] << ' ';
}



int main()
{
    ios::sync_with_stdio(false);
    cin.tie(NULL);
    read();
    solution();
}