Cod sursa(job #2409717)

Utilizator robx12lnLinca Robert robx12ln Data 19 aprilie 2019 12:50:43
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.06 kb
#include<bits/stdc++.h>
using namespace std;

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

const int DIM = 1e5 + 5;

int D[DIM], arr[DIM], t[DIM], aux[DIM], K, N;

void drum( int x ){
    if( t[x] != -1 )
        drum( t[x] );
    fout << arr[x] << " ";
}

int main(){

    fin >> N;
    for( int i = 1; i <= N; i++ )
        fin >> arr[i];

    K = 1;
    D[1] = 1;
    t[1] = -1;
    aux[1] = 1;
    aux[0] = -1;
    for( int i = 2; i <= N; i++ ){
        if( arr[i] > arr[ aux[K] ] ){
            D[i] = D[ aux[K] ] + 1;
            t[i] = aux[K];
            aux[++K] = i;
        }else{
            int st = 1;
            int dr = K;
            while( st <= dr ){
                int mid = (st + dr) / 2;
                if( arr[ aux[mid] ] >= arr[i] )
                    dr = mid - 1;
                else
                    st = mid + 1;
            }
            D[i] = D[dr] + 1;
            t[i] = aux[dr];
            aux[dr + 1] = i;
        }
    }
    fout << K << "\n";
    drum( aux[K] );
    return 0;
}