Cod sursa(job #1621646)

Utilizator alittlezzCazaciuc Valentin alittlezz Data 29 februarie 2016 20:29:34
Problema Subsir crescator maximal Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.16 kb
#include <stdio.h>
#include <vector>
#include <algorithm>

using namespace std;

#define ll long long unsigned
#define pb push_back
#define mp make_pair

const int N = 100005;
int v[N],sol[N],p[N];
vector <int> ans;

int binarySearch(int x, int n){
    int i,step;
    for(step = 1;step <= n;step <<= 1);
    for(i = 0;step;step >>= 1){
        if(i+step <= n && v[sol[i+step]] <= x){
            i += step;
        }
    }
    return i;
}

int main(){
    int i,n;
    freopen("maxk.in", "r", stdin);
    freopen("maxk.out", "w", stdout);
    scanf("%d",&n);
    for(i = 1;i <= n;i++){
        scanf("%d",&v[i]);
    }
    int l = 1;
    sol[1] = 1;
    for(i = 2;i <= n;i++){
        if(v[i] > v[sol[l]]){
            sol[++l] = i;
            p[i] = sol[l-1];
        }else{
            int poz = binarySearch(v[i]-1, l)+1;
            sol[poz] = i;
            p[i] = sol[poz-1];
        }
    }
    printf("%d\n",l);
    for(i = sol[l];p[i] > 0;i = p[i]){
        ans.push_back(v[i]);
    }
    ans.push_back(v[i]);
    reverse(ans.begin(), ans.end());
    for(auto it : ans){
        printf("%d ",it);
    }
    return 0;
}