Cod sursa(job #3247091)

Utilizator maryyMaria Ciutea maryy Data 5 octombrie 2024 16:18:15
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.2 kb
#include <bits/stdc++.h>

using namespace std;
ifstream in("scmax.in");
ofstream out("scmax.out");
const int NMAX = 1e5 + 5;
int v[NMAX], d[NMAX], p[NMAX], result[NMAX];
int n;
void read_data()
{
    in >> n;
    for(int i = 1; i <= n; i++)
        in >> v[i];
}
int BinarySearchFirstHigher(int val, int st, int dr)
{
    int mid, rez=0;
    while(st<=dr)
    {
        mid=(st+dr)/2;
        if(val<=d[mid])
        {
            rez=mid;
            dr=mid-1;
        }
        else
        {
            st=mid+1;
        }
    }
    return rez;
}
int main()
{
    read_data();
    int k = 1;
    d[k] = v[1];
    p[1] = 1;
    for(int i = 2; i <= n; i++)
    {
        if(v[i] > d[k])
        {
            k++;
            d[k] = v[i];
            p[i] = k;
        }
        else
        {
            int pos=BinarySearchFirstHigher(v[i], 1, k);
            d[pos] = v[i];
            p[i] = pos;
        }
    }
    int j = n;
    for(int i = k; i >= 1; i--)
    {
        while(p[j] != i)
            j--;
        result[i] = j;
    }
    out << k << "\n";
    for(int i = 1; i <= k; i++)
    {
        out << v[result[i]] << " ";
    }
    return 0;
}