Cod sursa(job #2172827)

Utilizator andreigeorge08Sandu Ciorba andreigeorge08 Data 15 martie 2018 18:11:31
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.3 kb
#include <bits/stdc++.h>

using namespace std;

ifstream fin("scmax.in");
ofstream fout("scmax.out");

long long lis[100005], a[100005], sir[100005], poz[100005];
int n;

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

void Lis()
{
    lis[1] = a[1];
    poz[1] = 1;
    int k = 1;

    for(int i = 2; i <= n; i++)
    {
        if(a[i] > lis[k])
        {
            lis[++k] = a[i];
            poz[i] = k;
        }
        else if(a[i] < lis[1])
        {
            lis[1] = a[i];
            poz[i] = 1;
        }
        else
        {
            int st = 1, dr = k, mij, p;

            while(st <= dr)
            {
                mij = (st + dr) / 2;

                if(lis[mij] >= a[i])
                {
                    p = mij;
                    dr = mij - 1;
                }
                else st = mij + 1;
            }

            lis[p] = a[i];
            poz[i] = p;
        }
    }

    int p = k;

    fout << k << "\n";

    for(int i = n; i >= 1 && p; i--)
    {
        if(poz[i] == p)
        {
            sir[p] = a[i];
            p--;
        }
    }

    for(int i = 1; i <= k; i++)
        fout << sir[i] << " ";
}
int main()
{
    Citire();
    Lis();
    return 0;
}