Cod sursa(job #2673902)

Utilizator Iulia14iulia slanina Iulia14 Data 18 noiembrie 2020 09:38:59
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.07 kb
#include <fstream>
#include <algorithm>
using namespace std;
ifstream cin ("scmax.in");
ofstream cout ("scmax.out");
struct ura{
    int poz, val;
} v[100005];int ans[100005];
int seg[400005];
bool cmp(ura a, ura b)
{
    if (a.val != b.val)
        return a.val < b.val;
    return a.poz < b.poz;
}
void update(int nod, int l, int r, int poz, int val)
{
    if (l == r)
        seg[nod] = val;
    else
    {
        int mid = (l + r) / 2;
        if (poz <= mid)
            update(nod * 2, l, mid, poz, val);
        else
            update(2 * nod + 1, mid + 1, r, poz, val);
        seg[nod] = max(seg[2 * nod], seg[2 * nod + 1]);
    }
}
int query(int nod, int l, int r, int ql, int qr)
{
    if (l >= ql && r <= qr)
        return seg[nod];
    int mid = (l + r) / 2, maxi = 0;
    if (ql <= mid)
        maxi = max(maxi, query(nod * 2, l, mid, ql, qr));
    if (qr > mid)
        maxi = max(maxi, query(nod * 2 + 1, mid + 1, r, ql, qr));
    return maxi;
}
int sol[100005];
int main()
{
    int n, i;
    cin >> n;
    for (i = 1; i <= n; i++)
        cin >> v[i].val, v[i].poz = i;
    sort (v + 1, v + n + 1, cmp);
    for (i = 1; i <= n; i++)
    {
        int j = i;
        while (j < n && v[j + 1].val == v[j].val)
            j++;
        int jj = j;
        while (j >= i)
        {
            if (v[j].poz == 1)
                ans[v[j].poz] = 1;
            else
                ans[v[j].poz] = query(1, 1, n, 1, v[j].poz - 1) + 1;
            update(1, 1, n, v[j].poz, ans[v[j].poz]);
            j--;
        }
        i = jj;
    }
    cout << query(1, 1, n, 1, n) << '\n';
    int k = 0, l = query(1, 1, n, 1, n);
    i = n;
    while (i && query(1, 1, n, v[i].poz, v[i].poz) != l)
        i--;
    sol[l] = v[i].val;
    while (l > 1)
    {
        if (v[i].val < sol[l] && query(1, 1, n, v[i].poz, v[i].poz) + 1 == l)
        {
            l--;
            sol[l] = v[i].val;
        }
        i--;
    }
    l = query(1, 1, n, 1, n);
    for (i = 1; i <= l; i++)
        cout << sol[i] << " ";
    return 0;
}