Cod sursa(job #1552900)

Utilizator alittlezzCazaciuc Valentin alittlezz Data 18 decembrie 2015 21:42:17
Problema Subsir crescator maximal Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.05 kb
#include <bits/stdc++.h>

using namespace std;

const int N = 100005;
int v[N],lis[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 && lis[i+step] <= x){
            i += step;
        }
    }
    return i;
}

int main()
{
    int n,i,l,poz;
    freopen("scmax.in", "r", stdin);
    freopen("scmax.out", "w", stdout);
    scanf("%d",&n);
    l = 1;
    for(i = 1;i <= n;i++){
        scanf("%d",&v[i]);
    }
    lis[1] = 1;
    for(i = 2;i <= n;i++){
        if(v[i] > v[lis[l]]){
            lis[++l] = i;
            p[i] = lis[l-1];
        }else{
            poz = binarySearch(v[i], l);
            lis[poz] = i;
            p[i] = lis[poz-1];
        }
    }
    printf("%d\n",l);
    for(i = lis[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;
}