Cod sursa(job #1497790)

Utilizator bciobanuBogdan Ciobanu bciobanu Data 7 octombrie 2015 12:42:31
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.13 kb
#include <bits/stdc++.h>

using namespace std;

const int Nmax = (int) 1e5;

int v[Nmax];
int Q[Nmax], q;
int best[Nmax], pos[Nmax];
int sol[Nmax];

int binSearch(int position)
{
    int p = 0;
    for ( int step = (1 << (31 - __builtin_clz(q))); step; step >>= 1 )
    {
        if ( p + step < q && v[ Q[ p + step ] ] < v[position] )
            p += step;
    }
    return p + ( v[ Q[p] ] < v[position] );
}

int main()
{
    ifstream in("scmax.in");
    ofstream out("scmax.out");
    in.tie(0);
    ios_base::sync_with_stdio(0);
    int n, p;

    in >> n;
    for ( int i = 0; i < n; i++ )
    {
        in >> v[i];
        p = binSearch(i);
        if ( p >= q )
        {
            pos[i] = q;
            Q[q++] = i;
        }
        else
        {
            pos[i] = p;
            Q[p] = i;
        }
    }
    in.close();
    p = n - 1;
    for ( int i = q - 1; i >= 0; i-- )
    {
        while ( pos[p] != i )
            p--;
        sol[i] = v[p];
    }
    out << q << '\n';
    for ( int i = 0; i < q; i++ )
        out << sol[i] << ' ';
    out.close();
    return 0;
}