Cod sursa(job #1759542)

Utilizator BlackNestaAndrei Manaila BlackNesta Data 19 septembrie 2016 14:47:43
Problema Subsir crescator maximal Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.34 kb
#include <bits/stdc++.h>
#define Nmax 100005

using namespace std;

int n, k;
int a[Nmax], lis[Nmax], poz[Nmax];
int sol[Nmax], p;

int CB(int k, int x)
{
    if(x <= lis[1]) return 1;
    if(x > lis[k]) return k + 1;
    /// caut cea mai din stanga
    /// pozitie p unde x <= lis[p]
    int st, dr, mij;
    p = 1;
    st = 1;
    dr = k;
    while(st <= dr)
    {
        mij = (st + dr) / 2;
        if(x <= a[mij])
        {
            p = mij;
            dr = mij - 1;
        }
        else
            st = mij + 1;
    }
    return p;
}

void Citire()
{
    ifstream f("scmax.in");
    f >> n;
    for(int i = 1; i <= n; i++)
        f >> a[i];
    f.close();
}

void Lis()
{
    lis[1] = a[1];
    poz[1] = 1;
    k = 1;
    for(int i = 2; i <= n; i++)
    {
        int x = a[i];
        p = CB(k, x);
        if(p > k)
        {
            lis[++k] = x;
            poz[i] = k;
        }
        else
        {
            lis[p] = x;
            poz[i] = p;
        }
    }
    ofstream g("scmax.out");
    g << k << "\n";
    for(int i = n; i >= 1 && k > 0; i--)
        if(poz[i] == k)
            sol[k] = a[i],
            k--;
    for(int i = 1; i <= p; i++)
        g << sol[i] << " ";
    g << "\n";
    g.close();
}

int main()
{
    Citire();
    Lis();
    return 0;
}