Cod sursa(job #1260749)

Utilizator TimitocArdelean Andrei Timotei Timitoc Data 11 noiembrie 2014 15:49:13
Problema Subsir crescator maximal Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 1.3 kb
#include <iostream>
#include <cstdio>

using namespace std;

int a[100010], q[100010], p[100010];
int up=1, n;

int cautBin(int x, int n)
{
    int s = 1, d = n;
    while (s <= d)
    {
        int mid = (s+d)/2;
        if (x >= q[mid])
            s = mid + 1;
        else
            d = mid - 1;
    }
    return s;
}

void sol()
{
    int pos;
    q[1] = a[1];
    up = 1;
    p[1] = 1;
    for (int i = 2; i <= n; i++)
    {
//         for (int i = 1; i <= up; i++)
//                cout << q[i] << " ";
//            cout << "\n";
        if (a[i] > q[up])
        {
            q[++up] = a[i];
            p[i] = up;
        }
        else
        {
            pos = cautBin(a[i], up);
            q[pos] = a[i];
            p[i] = pos;
        }

    }
    cout << up << "\n";
}

void drum()
{
    int afis[100010], nq=0;
    for (int i = n; i > 0 && up != 0; i--)
    {
        if (p[i] == up)
        {
            afis[++nq] = a[i];
            up--;
        }
    }
    for (int i = nq; i >= 1; i--)
        cout << afis[i] << " ";
}

int main()
{
    freopen("scmax.in","r",stdin);
    freopen("scmax.out","w",stdout);

    scanf("%d", &n);
    for (int i = 1; i <= n; i++)
        scanf("%d", &a[i]);
    sol();
    drum();
    return 0;
}