Cod sursa(job #2145662)

Utilizator the@EyE@Postavaru Stefan the@EyE@ Data 27 februarie 2018 15:34:13
Problema Subsir crescator maximal Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.46 kb
#include<stdio.h>
#include<algorithm>
#include<stdlib.h>
#include<unordered_map>
#include<deque>
#define INF 100001
#define tail(x) ((x^(x-1))&x)

using namespace std;

int n;
int a[INF], b[INF], len[INF];
unordered_map<int,int> ind;
int aib[INF];
deque<int> ans;

int cmp(const void *a, const void *b){
    return *(int*)a > *(int*)b;
}


void read_data(){
    freopen("scmax.in","r",stdin);
    freopen("scmax.out","w",stdout);
    scanf("%d",&n);
    for(int i=0;i<n;++i){
        scanf("%d",&a[i]);
        b[i] = a[i];
    }
    qsort(b,n,sizeof(int),cmp);
    for(int i=0;i<n;++i)
       ind[b[i]]=i;
    for(int i=0;i<n;++i)
        b[i] = ind[a[i]]+1;

}

void ins(int pos,int x){
    for(int i=pos;i<=n;i+=tail(i))
        if(aib[i]<x)aib[i]=x;
        else break;
}

int query(int x){
    int mx = 0;
    for(int i=x;i>0;i-=tail(i))
        if(aib[i]>mx)
            mx=aib[i];
    return mx;
}

int main(){
    read_data();
    len[0]=1;ins(b[0],1);
    int best=1;
    for(int i=1;i<n;++i){
        len[i] = query(b[i]-1)+1;
        if(len[i]>best)best=len[i];
        ins(b[i],len[i]);
    }
    printf("%d\n",best);
    int i;
    for(i=n-1;i>-1;i--)
        if(len[i]==best){ans.push_front(a[i]);best--;break;}
    for(i;best>0&&i>=0;--i)
        if(len[i]==best&&a[i]<ans[0]){
            ans.push_front(a[i]);
            best--;
        }
    for(i=0;i<ans.size();++i)printf("%d ",ans[i]);
    return 0;
}