Cod sursa(job #1552905)

Utilizator alittlezzCazaciuc Valentin alittlezz Data 18 decembrie 2015 21:49:16
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.17 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 && v[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]-1, l)+1;
            lis[poz] = i;
            p[i] = lis[poz-1];
        }
//        for(int j = 1;j <= l;j++){
//            printf("%d ",v[lis[j]]);
//        }
//        printf("\n");
    }
    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;
}