Cod sursa(job #2150936)

Utilizator felixiPuscasu Felix felixi Data 3 martie 2018 21:46:15
Problema Subsir crescator maximal Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 1.28 kb
#include <bits/stdc++.h>

using namespace std;

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

const int NMAX = 1000000;

int small[NMAX+2], best[NMAX+2], from[NMAX+2];
int N, longest = 0;
int v[NMAX+2];

int get_best_poz(int val)
{
    int st = 0, dr = longest, last = 0;
    while( st <= dr ) {
        int mid = (st + dr) / 2;
        if( v[ small[mid] ] >= val )
            dr = mid - 1;
        else
            st = mid + 1, last = mid;
    }
    return small[ last ];
}

int main()
{
    in >> N;
    for( int i = 1;  i <= N;  ++i ) {
        in >> v[i];
        if( i == 1 ) {
            best[i] = 1;
            small[i] = 1;
            from[i] = 0;
            continue;
        }
        int poz = get_best_poz(v[i]);
        best[i] = best[poz] + 1;
        longest = max(longest, best[i]);
        from[i] = poz;
        small[ best[i] ] = i;
        cout << from[i] << ' ';
    }
    int poz = 0;
    for( int i = 1;  i <= N;  ++i ) {
        if( best[i] > best[poz] )
            poz = i;
    }
    out << best[poz] << '\n';
    vector<int> ans;
    while( poz ) {
        ans.push_back(v[poz]);
        poz = from[poz];
    }
    reverse(ans.begin(), ans.end());
    for(auto& i : ans)
        out << i << ' ';
    return 0;
}