Cod sursa(job #1794722)

Utilizator DoubleNyNinicu Cristian DoubleNy Data 1 noiembrie 2016 17:50:07
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.12 kb
#include <bits/stdc++.h>
#define lli long long int
using namespace std;
int arr[100001],pos[100001],len[100001];
int n,best = 0;

int BS(int low,int up,int x){
    int mid;
    while( low <= up){
        mid = (low + up ) / 2;
        if(x < arr[len[mid]])
            low = mid + 1;
        else
            up = mid - 1;
    }
    return(low);
}
void solve(){
        int length = 0;
        for(int i = n; i >= 1; i--){

            pos[i] = 0;
            length = BS(1,best, arr[i]);
            if(length > best){
                    pos[i] = len[length - 1];
                    best = length;
                    len[length] = i;

            }   else if (length <= best){

                            pos[i] = len[length - 1];
                            if( arr[i] > arr[len[length]] )
                                len[length] = i;
                     }
        }
}

int main(){
    ifstream cin("scmax.in");
    ofstream cout("scmax.out");
    cin >> n;
    for(int i=1;i<=n;i++)
            cin >> arr[i];
    solve();
    cout << best << endl;
    for(int i=len[best];i>0;i=pos[i])
        cout << arr[i] << ' ';
    return(0);
}